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

时间:2011-06-11 19:15:46

标签: ruby rubygems bundler

运行rake时出现此错误:

  

您已激活rake 0.9.2,但您的Gemfile需要rake 0.8.7。考虑使用bundle exec。

使用bundle exec rake代替rake似乎有效,但这是解决此问题的最佳方法吗?

9 个答案:

答案 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,然后重试。