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


128

运行时出现rake此错误:

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

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


这也是使RVM成为如此出色的工具的原因。这样,您就可以为每个这些项目拥有一套单独的gem,因此您不必担心这种情况再次发生。
rm-rf

Answers:


84

使用bundle exec 正确的方法。

基本上发生的是,您已将rake更新为0.9.2,现在它与Gemfile中指定的版本冲突。以前,rake您的最新版本与Gemfile中的版本匹配,因此仅使用时就不会收到任何警告rake

Yehuda Katz(Bundler的最初开发者之一)在此博客文章对此进行了解释。

为了避免一直输入bundle exec ...,可以在外壳程序中为Bundler常用的命令设置别名或函数。例如,这是我在Rake中使用的:

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

5
博客文章并没有真正解释太多。真正的问题是:为什么原始红宝石没有得到正确的依赖关系,为什么抱怨拥有错误的依赖关系?
奥西斯

64

如果您有理由保留当前版本的rake(或任何其他引起问题的gem),那么matt是正确的,最好的方法是运行bundle exec。这将使用Gemfile中指定的版本,而不是使用已安装的gem的最新版本。(如果您不想每次运行rake都键入以下内容, nathan.f77在下面有一个很好的解决方案bundle exec

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

bundle update rake

这实际上将更新您的Gemfile.lock以使用最新版本的rake,而不必bundle exec每次都运行。

注意:如果仅运行bundle update此命令,它将更新Gemfile中的所有gem,而不是仅仅更新rake,这可能不是您想要的,因为如果应用程序发生故障,您将不知道是哪个gem更新导致了它。


不推荐使用而不必使用较旧版本的方法bundle exec是卸载rake的较新版本。

$ gem卸载耙

选择要卸载的宝石:
 1.耙0.8.7
 2.耙-0.9.2
 3.所有版本
> 2
成功卸载了rake-0.9.2

这行得通,但是如果您正在使用使用不同版本rake的多个应用程序,则可能会很痛苦,因为您将发现自己不断需要安装和卸载不同版本。


这对我有用。由于某种原因,仅安装了一个版本(0.8.7)。所以首先我做到了gem install rake。然后gem uninstall rake选择0.9.2。
B

7
bundle update还会将没有指定版本的所有gem更新为可用的最新版本。那可能不是您想要的。bundle update rake将会更多。
亚历克斯·内(Alex Neth)

我有同样的问题,public_suffix而不是rakebundle update public_suffix不幸的是,跑步没有任何效果。
Dmitri Zaitsev '18


13

上次发生这种情况是我更新了所有宝石。我做了一个gem uninstall rake,它列出了版本选项。我选择了较新的版本,然后就不必再使用bundle exec了。

基本上,如果您使用bundle exec它,则使用捆绑包中安装的任何gem版本,因此Gemfile中的内容是什么。没有bundle exec它,则使用系统默认的任何版本。


8

哦!Katz文章非常好!

我最喜欢这种解决方案:

bundle install --binstubs

这样您现在可以输入

bin/rake .stuff.

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


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; }

为了明确起见,.bashrc文件可能位于您的主目录[〜/ .bashrc]中。每次打开新的终端窗口时都会加载此文件。
瑞安2012年

0

每次都不键入的另一种方法是使用Makefile,例如

rake :
    bundle exec rake
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.