更新后如何保持 Gemfile 中的所有 gem 兼容

Posted

技术标签:

【中文标题】更新后如何保持 Gemfile 中的所有 gem 兼容【英文标题】:How do I keep all gems in Gemfile compatible after an update 【发布时间】:2011-12-16 15:45:08 【问题描述】:

我的问题已经被问到here,但我试图了解其背后的原因,而不是如何解决它。

我得到的错误是;

You have already activated rspec-core 2.7.1, but your Gemfile requires rspec-core 2.6.4. Using bundle exec may solve this. (Gem::LoadError)

现在我得到了各种解决方案,比如使用“mpapis-bundler”,或者创建“bundle exec”的简写,但我的印象是那是什么

$bundle install --binstubs

是为了。

更具体地说,由于我的 gemfile 中没有为 rspec-rails 指定版本号,为什么会出现这种不兼容性?我尝试的时候也出现了错误

$rake db:migrate

告诉我

You have already activated rake 0.9.2.2, but your Gemfile requires rake 0.9.2. Consider using bundle exec.

任何解释都将不胜感激。

编辑: 我的应用程序的所有宝石都在一个宝石集中,我再次更新了我的宝石。更新不应该确保相关的 gem 兼容吗?

【问题讨论】:

【参考方案1】:

当您在系统中安装的 gem 比在 Rails 应用中安装的新 gem 时,会发生这种情况。

Bundler 只是告诉你必须坚持你的 Gemfile 状态。

这就是跑步的目的:

bundle exec rake db:migrate

-> 运行与 Gemfile 提供的完全相同的 rake 版本。

关于从 gemfile 更新 gem,只需:

bundle update

避免这种无聊事情的最简单方法是通过创建 gemset 来隔离你的 gem。为此,我使用 RVM。

【讨论】:

我确实在使用 rvm,而且我确实有一个 gemset。此错误发生在之后我运行“$bundle update”,因为我想更新“annotate”gem(我拥有的版本与 Rails 3.1 不兼容)。我的印象是运行“$bundle update”会更新 Gemfile.lock 中的所有 gem,并且由于我没有版本号,它会将它们更新为最新的。我希望 rspec 会将 all 相关的 gem 更新为兼容的 gem。我错了吗? 你有专门的宝石吗?你有一个.rvmrc 文件加载它吗?你的全局 gemset 是空的吗? 我有一个加载我的 gemset 的 .rvmrc 文件。我还没有在全球安装任何宝石。我该如何检查? 1.使用您要测试的 gemset:rvm gemset use foo。 2.列出里面的宝石:gem list 谢谢。全局 gemset 为空。我记得我已经清空了它,以确保我的 rails 应用程序的 gemset 中只有 gem。【参考方案2】:

正如@apneadiving 所说,运行“$bundle install”会更新你所有的bunldes。然而,在运行“$bundle install --binstubs”之后,每当我省略“bundle exec”部分时,我仍然会遇到不兼容的 gems 错误。

随后我需要更新我的 Gemfile,因为我添加了另一个 gem,现在它们可以工作了。我假设不兼容问题已由 gem 创建者解决。

【讨论】:

【参考方案3】:

关于 rake 版本 0.9.2.2,任何一种方法都是为项目创建一个新的 gemset 并维护与您的 Gemfile 匹配的 gem 版本。

例如,如果有两个包含版本 0.9.2 和 0.9.2.2 的 rake gem,指定 rake 版本“0.9.2”虽然会安装,但不会运行任何任务,除了提示错误提示

'您已经激活了 rake 0.9.2.2,但是您的 Gemfile 需要 rake 0.9.2。使用 bundle exec 可以解决这个问题。'

我希望 bundle install 在 Gemfile.lock 中锁定 gem 版本并选择 rake 0.9.2,但它会在 gemset 中查找,默认情况下启用 rake 0.9.2.2。

只是提醒使用rails book从敏捷Web开发中捆绑安装的目的,

'bundle install 将使用 Gemfile.lock 作为起点,并且只安装 此文件中指定的各种 gem 的版本。为此,它是 重要的是这个文件被签入你的版本控制系统,因为这 将确保您的同事和部署目标都将使用 完全相同的配置。'

但它不会那样工作,

最好是卸载 rake 0.9.2.2 并使用 rake 0.9.2,或者使用 bundle update rake,将 Gemfile.lock 中的 rake 版本更新为 0.9.2.2

【讨论】:

很公平。不过,我想知道为什么它没有自动更新所有必需的 gem,因为我在 Gemfile 中没有版本号。对于特定问题,这是一个很好的解决方法,但不适用于所有实例。

以上是关于更新后如何保持 Gemfile 中的所有 gem 兼容的主要内容,如果未能解决你的问题,请参考以下文章

20--Bundle与Gemfile

使用bundler时如何在Gemfile中使用gem?

Gemfile 中的 Ruby Bundler 多个源

Gemfile 中的宝石顺序有影响吗?

在将数据库引擎升级到 PostgreSQL 12 时,是不是也应该为“pg”gem 更新 Gemfile?它们有啥关系?

如何在我的 Gemfile 中找到未使用的宝石