运行rake
时出现此错误:
您已激活rake 0.9.2,但您的Gemfile需要rake 0.8.7。考虑使用bundle exec。
使用bundle exec rake
代替rake
似乎有效,但这是解决此问题的最佳方法吗?
答案 0 :(得分:76)
使用bundle exec
是正确的方法。
基本上发生的事情是您已将rake更新为0.9.2,现在与Gemfile中指定的版本冲突。以前最新版本的rake
已与您的Gemfile中的版本匹配,因此在使用rake
时您没有收到任何警告。
Yehuda Katz(最初的Bundler开发人员之一)在this blog post解释了这一切。
为避免一直键入bundle exec ...
,您可以在shell中为通常与Bundler一起使用的命令设置别名或功能。例如,这就是我用于Rake的内容:
$ type bake
bake is a function
bake ()
{
bundle exec rake "$@"
}
答案 1 :(得分:58)
如果您有理由保留rake的当前版本(或其他任何宝石导致问题),matt是正确的,最好的方法是运行bundle exec
。这将使用Gemfile中指定的版本,而不是使用已安装的最新版本的gem。 (如果您不希望每次运行rake时都输入bundle exec
,则nathan.f77有一个很好的解决方案below
否则,如果没有理由不更新rake,则可以运行
bundle update rake
这实际上会更新您的Gemfile.lock以使用最新版本的rake,而不必每次都运行bundle exec
。
注意:如果只运行bundle update
,这将更新Gemfile中的所有宝石,而不仅仅是rake,这可能不是你想要的,因为如果你的东西中断了应用程序,你不知道哪个宝石更新导致它。
在不使用bundle exec
的情况下保留较旧版本的推荐方法是卸载较新版本的rake。
$ gem uninstall rake Select gem to uninstall: 1. rake-0.8.7 2. rake-0.9.2 3. All versions > 2 Successfully uninstalled rake-0.9.2
这很有效,但是如果你正在使用多个使用不同rake版本的应用程序,这可能很麻烦,因为你会发现自己经常需要安装和卸载不同的版本。
答案 2 :(得分:18)
尝试bundle clean --force
删除不在此捆绑包中的所有系统gem
答案 3 :(得分:13)
上次这发生在我身上,我更新了所有宝石。我做了gem uninstall rake
并列出了版本选项。我选择了新的,然后我不必再使用bundle exec
了。
基本上,如果你使用bundle exec
它会使用你的bundle安装的任何gem版本,那么Gemfile中的内容是什么。如果没有bundle exec
,它将使用您系统默认的任何版本。
答案 4 :(得分:8)
bundle exec
是正确的,但您不希望每次都输入它。
你可以将它放在你的.bashrc中:
# Automatically invoke bundler for rake, if necessary.
rake() { if [ -e ./Gemfile.lock ]; then bundle exec rake "$@"; else /usr/bin/env rake "$@"; fi; }
答案 5 :(得分:7)
噢! Katz的文章很棒!
我最喜欢这个解决方案:
bundle install --binstubs
以便您现在可以输入
bin/rake .stuff.
对于像我这样开发2.3和3.0.9应用程序的人来说,这让我感觉好多了。
答案 6 :(得分:1)
刚刚使用:bundle update
就我而言,它通过 Gemfile.lock 文件解决了我的依赖版本问题,并将软件包更新为最新版本。
答案 7 :(得分:0)
另一种每次都不输入的方法是使用Makefile,例如
rake :
bundle exec rake
答案 8 :(得分:0)
您可能还希望删除Gemfile.lock文件并运行
bundle install
或仅bundle
,然后重试。