2012-02-09 123 views
0

总之不同版本耙,错误消息看起来像以下:Gemfile.lock的在部署环境

$ 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
  • 开发者的d才有发展环境rake 0.9.2安装这个版本号是Gemfile.lock文件
  • 部署服务器已安装了多个Rails应用
  • 这些应用程序是由不同的程序员编写
  • 这些程序员们安装在不同耙的版本开发环境
  • 他们有的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耙的相同版本可避免
  • 错误信息
  • 要求所有开发者使用相同版本的耙

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

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

+0

另一种可能的解决方案是使用RVM:RVM让您可以使用自己完全独立且专用的环境部署每个项目 - 从特定版本的Ruby,一直到所需的精确gem集,以运行您的应用程序。 – peterpengnz 2012-02-12 01:27:15

回答

4

你一定要检查你的Gemfile.lock。它包含您知道将与您的应用程序配合使用的宝石版本。所以,当你将安装捆绑到不同的环境时,你知道它应该可以工作。

说几个月后,现在有人会在没有Gemfile.lock的情况下安装一个软件包。他们会在你的Gemfile中获得最新版本的宝石(至少是指定版本的宝石),并且不能保证你的应用程序甚至可以使用这些宝石。使用Gemfile.lock,应该保证你的应用程序应该运行,因为任何使用它的人或者运行测试的人都应该使用那些冻结的gem版本。

解决您的问题,我会做:

bundle update rake 

,然后提交的Gemfile和Gemfile.lock的。这样,你告诉任何运行你的应用程序的人,你应该使用0.9.2.2的耙子。这是您知道将与您的应用程序一起使用的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在./bin先检查在寻找RVM之前或您的创业板安装二进制文件。如果你这样做,记得在你的.gitignore文件中添加'bin'。

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

很好的答案。不过,我认为最好的解决方案是要求所有开发人员使用相同版本的rake。通过将更新的Gemfile和Gemfile.lock重新提交给版本控制,只解决了一个应用程序的问题。在生产服务器上,我们有很多应用程序。出于某种原因,一旦你为一个应用程序激活了rake 0.9.2.2。您会发现其他使用rake 0.9.2的应用程序无法重新启动。所以不知何故,我们需要保持所有应用程序的rake版本相同。这可能不是技术问题,而是合乎逻辑的。我忘了在我的问题中提到RVM。 – peterpengnz 2012-02-12 00:40:52

+0

继续... RVM创建单独的宝石套装。这可能是解决这个问题的技术方案。谢谢 – peterpengnz 2012-02-12 00:43:10

1

生产力耗尽你的团队将与试图让每个人都在同一个版本的rake(第二和第三的解决方案),并管理所有下游的冲突可能是非常高的体验。当他们需要使用gem/script/module XYZ但是XYZ和rake的强制版本存在问题时,它也会提高开发者的沮丧程度。

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

+0

这是真的。这不简单。如果其中一个gem只需要用于rake 0.9.2.2或rake 0.9.2,开发人员将会感到沮丧。而你无法控制其他人的宝石。我想我现在正在改变我的结论:理论上的最佳解决方案是要求所有开发人员使用相同版本的Rake。我希望RVM能为我解决问题,因为它为每个rails应用程序创建单独的gem集。 – peterpengnz 2012-02-12 00:46:52