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

当运行 rake时,我得到这个错误:

您已经激活了 rake 0.9.2,但您的 Gemfile 需要 rake 0.8.7。

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

91522 次浏览

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

基本上,如果你使用 bundle exec,它会使用你的 bundle 安装的任何 gem 版本,所以 Gemfile 有什么。如果没有 bundle exec,它将使用系统默认的任何版本。

Katz 的文章太棒了!

我最喜欢这个解决方案:

bundle install --binstubs

这样你就可以打字了

bin/rake .stuff.

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

正确地使用 bundle exec 来完成这项工作。

基本上发生的事情是你已经将 rake 升级到0.9.2,这与 Gemfile 中指定的版本冲突了。以前的最新版本的 rake你已经匹配的版本在你的 Gemfile,所以你没有得到任何警告时,简单地使用 rake

Yehuda Katz (最初的 Bundler 开发人员之一)在 这篇博文中解释了这一切。

为了避免一直键入 bundle exec ...,您可以在 shell 中为您通常在 Bundler 中使用的命令设置一个别名或函数。例如,我在 Rake 中使用的是:

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

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

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

bundle update rake

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

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


保留旧版本而不必使用 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 的应用程序,这可能是一种痛苦,因为您会发现自己必须不断地安装和卸载不同的版本。

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

试试 bundle clean --force

它删除了这个包中没有的所有系统 gem

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

rake :
bundle exec rake

您最好删除 Gemfile.lock 文件并运行它 bundle install或者仅仅 bundle,然后再试一次。

刚用过: bundle update

在我的例子中,它用 Gemfile.lock 文件解决了我的依赖版本问题,它用最新版本更新了包。

当 Gemfile 和 Gemfile.lock 有不同的版本时,就会出现这种情况。在我的例子中,Gemfile.lock 有 strcan (3.0.3) ,Gemfile 有 ruby 3.0.4,只需删除 Gemfile.lock,运行 bundle install 或 bundle update

由于某些原因,有时必须安装 gem 的最新版本。
有时,需要基于旧版本运行旧项目。
有时,解决这类问题的最快方法是删除 Gemfile.lock并运行 bundle exec。这将生成一个带有我们实际安装的 gem 的新 Gemfile.lock
如果一切正常,这是最简单的方法。