Gemfile.lock在部署环境中具有不同版本的Rake

时间:2012-02-09 21:27:31

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

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

$ 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文件在我们的颠覆中

可能的解决方案:

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

我的问题是:这是正确的解决方案吗?或者有没有正确的解决方案?

我仍然不确定Gemfile.lock文件应该在subversion中。

2 个答案:

答案 0 :(得分:4)

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

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

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

bundle update rake

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

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

  • 捆绑exec:

    $ 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。如果你这样做,请记得在你的.gitignore文件中添加'bin'。

  • rubygems-bundler宝石。这个gem生成包装器,试图确定何时为你使用bundle exec。

答案 1 :(得分:1)

您的团队在尝试让每个人都使用相同版本的rake(第二和第三个解决方案)并管理所有下游冲突时可能会遇到高效的工作效率。当需要使用gem / script / module XYZ时,它也会提高开发人员的挫败程度,但是XYZ和rake的强制版本存在问题。

只要采取措施确保bundle命令在您的环境中高效执行,解决方案1将对您团队的工作效率产生更小的负面影响。 IMHO。