简而言之,错误消息如下所示:
$ 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
文件rake 0.9.2
,其他人有rake 0.9.2.2
Gemfile.lock
文件在我们的颠覆中可能的解决方案:
bundle exec rake install
然后bundle update
可以避免Gemfile
我的问题是:这是正确的解决方案吗?或者有没有正确的解决方案?
我仍然不确定Gemfile.lock
文件应该在subversion中。
答案 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'。
答案 1 :(得分:1)
您的团队在尝试让每个人都使用相同版本的rake
(第二和第三个解决方案)并管理所有下游冲突时可能会遇到高效的工作效率。当需要使用gem / script / module XYZ时,它也会提高开发人员的挫败程度,但是XYZ和rake
的强制版本存在问题。
只要采取措施确保bundle
命令在您的环境中高效执行,解决方案1将对您团队的工作效率产生更小的负面影响。 IMHO。