【问题标题】:How to force the update of a gem with bundler?如何使用捆绑器强制更新 gem?
【发布时间】:2011-10-25 23:39:12
【问题描述】:

我有一个私人 git 服务器,托管我们开发的 gem。 gem 得到了一些提交,但版本实际上并没有改变。

即使版本没有更改,我如何强制捆绑程序更新我的 gem?

我尝试了“bundle update mygemname”,但没有更新任何内容。

谢谢

【问题讨论】:

    标签: ruby-on-rails git bundler


    【解决方案1】:

    您也可以使用 :ref 选项将 git hashref 直接放在 Gemfile 中

    gem 'foo', :git => 'git://github.com/foobar/foo.git', :branch => '0.9-beta', :ref => '9af382ed'
    

    如果您无法控制所述 gem,并且阻止捆绑器为您提供更新版本以防出现重大更改,则特别有用。

    【讨论】:

      【解决方案2】:

      首先,不要那样做。如果你改变了你的 gem,你应该更新它的版本号。否则,只会令人困惑。

      但是,如果你真的想这样做,你可以先用巨大的锤子去除你的宝石。

      $ gem uninstall foo
      $ bundle update
      

      【讨论】:

      • 是的,你说得对,这是可行的,但我唯一一次这样做是在 gem 发布之前测试和修复问题。例如您创建 gem 文件,安装它以测试它,然后立即删除 gemfile —— 不留痕迹。这基本上是一个预发布版本,在这种情况下你应该将一个预发布版本放在 .gemspec 文件中。
      • 只有当 gem 安装在本地时才有效,而不是在特定应用程序中使用 bundler 安装时有效。
      • 你指的是什么“这个”?我的回答还是蒂洛的评论?因为我的回答应该总是有效的。如果 gem 丢失,它将通过更新重新安装。
      • 对不起,我不是很清楚! “this”表示您的帖子,因为您无法在仅与 bundler 捆绑且未使用“gem install”安装的 gem 上执行“gem 卸载”。
      • 当然可以。 gem uninstall 将卸载一个 gem,不管它最初是如何安装的。我怀疑您可能不止一次地安装了 gem,可能以 root 身份安装在您用户的个人 gem 目录下,这可能会造成混淆。我当然会建议您使用 rvm 来防止这种情况发生。
      【解决方案3】:

      这不起作用 - 没有“强制”选项 - 您必须修改 .gemspec 文件并增加版本号,然后执行 gem build ...bundle install

      对于 bundler 来说,能够从您的 gem 中读取版本号至关重要,该版本号是在 .gemspec 文件中引入的。这不仅会让 bundler 或 gem update 感到困惑,而且如果您忘记更新 .gemspec 文件中的版本号,也会让人们感到困惑。他们最终会到处乱放 gem 文件,并且无法分辨它们是哪个版本,例如哪个更新? (当然你可以使用 md5-sum,但这不是重点)。

      最好的办法是更正 .gemspec 文件中的错误,然后重新发布 gem。

      检查捆绑器源代码以获取可用选项:

      例如:bundler-1.0.15/lib/bundler/cli.rb

      (搜索desc "install"

      【讨论】:

      • 感谢您的回答。我知道增加 gem 版本会更好,但这意味着您必须更改主机应用程序才能引用新版本的 gem。或者,也许我可以简单地将 gem "mygemname" 放在 gemfile 中,这样它就会始终获取最新版本。
      • 您可以随时运行bundle update 来更新您的gem 的最新版本!您使用哪个版本的 Rails?如果你有一个 Gemfile,你可以把这个语法 gem 'mygemname' , '>=0.5.0' 看:gembundler.com/man/gemfile.5.htmlgembundler.com/man/bundle-update.1.html
      • 一个--force选项(参见this answer),它可以工作。
      • @Ian 看起来 --force 选项是“gem”命令的新增功能。 2011 年它不存在。
      • 您搜索某些内容然后偶然发现自己的答案的时间???
      【解决方案4】:

      从 1.11 版开始,bundle install 仅具有一个 --force 选项,即使它们已经安装,也会重新下载每个 gem。

      【讨论】:

      • $bundle install --force 未知开关'--force'
      • 您使用的是 bundler 1.10 还是之前的版本?它是在 1.11 中添加的,如果文档正确:bundler.io/v1.15/man/bundle-install.1.html
      • 这个标志现在被命名为--redownload,因为它的价值,但使用--force仍然可以正常工作,只是警告它已被弃用。
      【解决方案5】:

      这没有回答上面的确切问题,但我在 Google 上搜索“如何强制更新捆绑器中的 gem”,结果出现了。

      我不是要强制将 gem 更新到 ruby​​gems.org,而是尝试重新安装已安装到本地系统上捆绑路径的 gem。具体来说,我正在尝试使用本机扩展 (nokogiri) 重新安装 gem。

      我如何从我的项目中删除它如下;假设您的 --pathvendor/bundle 并且您在项目的根目录中,请运行:

      find vendor/bundle/ruby/2.0.0 -name "*nokogiri*" -depth 2
      

      验证这些文件/目录是特定于 nokogiri 的,然后删除它们:

      find vendor/bundle/ruby/2.0.0 -name "*nokogiri*" -depth 2 | xargs rm -rf
      

      现在你可以像往常一样运行你的 bundle install 命令了:

      bundle install --path vendor/bundle
      

      注意:您当然需要将上面的 2.0.0 更改为您的 ruby​​ 版本。 ls vendor/bundle/ruby 查看捆绑器为哪个版本安装了 gems。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-24
        • 1970-01-01
        • 1970-01-01
        • 2017-06-12
        • 2023-03-23
        • 1970-01-01
        • 2011-05-03
        • 2011-01-09
        相关资源
        最近更新 更多