【问题标题】:Gemfile.lock has different version of Rake in deployment environmentGemfile.lock 在部署环境中有不同版本的 Rake
【发布时间】:2012-02-09 21:27:31
【问题描述】:

简而言之,错误信息如下所示:

$ bundle install
rake aborted!
You have already activated rake 0.9.2.2, but your Gemfile requires rake 0.9.2. Using bundle exec may solve this.

这里是这个错误的解释:

  • 部署服务器已安装rake 0.9.2.2
  • 应用程序Gemfile 没有rake 所需的版本号
  • 开发者的开发环境已经安装了rake 0.9.2,这个版本号在Gemfile.lock文件中
  • 部署服务器安装了许多 rails 应用程序
  • 这些应用程序由不同的程序员编写
  • 这些程序员在他们的开发环境中安装了不同的 rake 版本
  • 其中一些有rake 0.9.2,另一些有rake 0.9.2.2
  • 通过阅读Yehuda Katz's Clarifying the Roles of the .gemspec and GemfileGemfile.lock文件在我们的subversion中

可能的解决方案:

  • 可以通过运行bundle exec rake install 然后运行bundle update 来避免错误消息
  • 如果我们要求所有开发人员在Gemfile 中指定相同版本的rake,可以避免错误消息
  • 要求所有开发者使用相同版本的 rake

我的问题是:这是正确的解决方案吗?还是有任何正确的解决方案?

我仍然不确定Gemfile.lock 文件是否应该在颠覆中。

【问题讨论】:

  • 另一种可能的解决方案是使用 RVM:RVM 让您可以使用自己完全独立的专用环境部署每个项目——从特定版本的 ruby​​,一直到所需的精确集合gems 来运行你的应用程序。

标签: ruby-on-rails gem rake bundler gemfile


【解决方案1】:

您绝对应该检查您的 Gemfile.lock。它包含您知道将与您的应用程序一起使用的 gem 版本。因此,当您在不同的环境中捆绑安装时,您知道它应该可以工作。

假设几个月后有人在没有 Gemfile.lock 的情况下进行捆绑安装。他们将在您的 Gemfile 中获得最新版本的 gem(至少是具有指定版本的 gem),并且无法保证您的应用程序甚至可以使用这些 gem。使用 Gemfile.lock,应该可以确保您的应用程序应该可以运行,因为任何使用过它或对其进行测试的人都应该在那些冻结的 gem 版本中让它处于通过状态。

要解决您的问题,我会这样做:

bundle update rake

然后提交 Gemfile 和 Gemfile.lock。这样,您就可以告诉运行您的应用程序的任何人您应该使用 0.9.2.2 的 rake。这是您知道的适用于您的应用的 rake 版本,并且您的测试是针对此版本运行的。

要实际运行正确的版本,您有几个选择:

  • 捆绑执行:

    $ bundle exec rake -T
    

为您的 .bash_profile、.zshrc 或 .profile 添加别名也可能会有所帮助:

# in .bash_profile
alias b="bundle exec"
$ b rake -T
  • 捆绑 binstubs

    # in your .bash_profile
    export PATH="./.bin:$PATH"
    $ bundle install --binstubs
    

这会将您的 Gemfile 的二进制文件安装到 ./bin 目录,并且路径更改将强制您的 shell 在查看 rvm 或您的 gem install 二进制文件之前先签入 ./bin。如果您这样做,请记住将“bin”添加到您的 .gitignore 文件中。

  • rubygems-bundler宝石。此 gem 生成包装器,尝试确定何时为您使用 bundle exec。

【讨论】:

  • 好答案。但是,我认为最好的解决方案是要求所有开发人员使用相同版本的 rake。通过将更新后的 Gemfile 和 Gemfile.lock 重新提交到版本控制,只能解决一个应用程序的问题。在生产服务器上,我们有许多应用程序。出于某种原因,一旦您为一个应用程序激活了 rake 0.9.2.2。您会发现其他使用 rake 0.9.2 的应用程序无法重新启动。所以不知何故,我们需要为所有应用程序保持相同的 rake 版本。这可能不是技术问题,而是逻辑问题。我忘了在我的问题中提到 RVM。
  • 继续... RVM 创建单独的 gem 集。这可能是这个问题的技术解决方案。谢谢
【解决方案2】:

您的团队在尝试让每个人都使用同一版本的 rake(第 2 和第 3 解决方案)并管理所有下游冲突时会遇到的生产力消耗可能非常高。当他们需要使用 gem/script/module XYZ 但 XYZ 和rake 的强制版本存在问题时,这也会提高开发人员的挫败感。

只要采取措施确保bundle 命令在您的环境中高效执行,解决方案 1 将对您团队的生产力产生的负面影响要小得多。恕我直言。

【讨论】:

  • 确实如此。这不简单。如果其中一个 gem 仅适用于 rake 0.9.2.2 或 rake 0.9.2,开发人员会感到沮丧。而且你无法控制别人的宝石。我想我现在正在改变我的结论:理论上最好的解决方案是要求所有开发人员使用相同版本的 rake。我希望 RVM 能为我解决这个问题,因为它为每个 Rails 应用程序创建了单独的 gem 集。
猜你喜欢
  • 1970-01-01
  • 2015-11-26
  • 1970-01-01
  • 2019-02-09
  • 2012-04-15
  • 2023-03-03
  • 2011-11-29
  • 1970-01-01
  • 2019-12-10
相关资源
最近更新 更多