你已经激活了X,但是你的Gemfile需要Y.

运行rake我得到这个错误:

你已经激活了rake 0.9.2,但是你的Gemfile需要rake 0.8.7。 考虑使用bundle exec。

使用bundle exec rake而不是rake似乎是可行的,但这是解决这个问题的最好方法吗?

使用bundle exec 正确的方法。

基本上发生了什么是你已经更新耙0.9.2,现在与您的Gemfile中指定的版本冲突。 以前最新版本的rake与你的Gemfile中的版本相匹配,所以当你简单地使用rake时候你没有得到任何警告。

Yehuda Katz(原Bundler开发者之一)在这篇博文中解释了这一切。

为了避免一直inputbundle exec ... ,你可以在你的shell中设置一个别名或者函数,用于Bundler常用的命令。 例如,这是我用于Rake的:

 $ type bake bake is a function bake () { bundle exec rake "$@" } 

如果您有理由保留当前版本的rake(或任何其他gem导致的问题), matt是正确的,那么执行此操作的最佳方法是运行bundle exec 。 这将使用您的Gemfile中指定的版本,而不是使用已安装的最新版本的gem。 (如果你不想在每次运行rake的时候inputbundle exec nathan.f77 下面有一个很好的解决scheme)

否则,如果没有理由不更新耙,你可以运行

 bundle update rake 

这实际上会更新你的Gemfile.lock来使用最新版本的rake,而不是每次都运行bundle exec

注意:如果只运行bundle update将更新Gemfile中的所有gem,而不是rake,这可能不是您想要的,因为如果应用程序中的某些内容中断,您将无法知道哪个gem更新导致了这种情况。


保留旧版本而不必使用bundle execbuild议方法是卸载较新版本的rake。

 $ gem卸载耙

selectgem卸载:
  1. rake-0.8.7
  2. rake-0.9.2
  3.所有版本
 > 2
成功卸载rake-0.9.2

这是有效的,但是如果你正在使用不同版本的耙子的多个应用程序,这可能是一个痛苦,因为你会发现自己经常需要安装和卸载不同的版本。

上次这件事发生在我身上,我已经更新了所有的gem。 我做了一个gem uninstall rake ,它列出的版本选项。 我select了新的,然后我不必再使用bundle exec了。

基本上,如果你使用bundle exec它使用你的bundle安装的任何gem版本,那么Gemfile中的内容是什么。 没有bundle exec它使用你系统默认的任何版本。

哦! Katz的文章非常棒!

我喜欢这个解决scheme最好的:

 bundle install --binstubs 

这样你就可以input了

 bin/rake .stuff. 

对于像我自己开发2.3和3.0.9应用程序的人来说,这让我感觉好多了。

bundle exec是正确的,但是你不想每次都input它。

你可以把它放在你的.bashrc中:

 # Automatically invoke bundler for rake, if necessary. rake() { if [ -e ./Gemfile.lock ]; then bundle exec rake "$@"; else /usr/bin/env rake "$@"; fi; }