【问题标题】:You have already activated X, but your Gemfile requires Y你已经激活了 X,但是你的 Gemfile 需要 Y
【发布时间】:2011-09-13 03:55:06
【问题描述】:

运行rake 时出现此错误:

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

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

【问题讨论】:

  • 这也是RVM 如此出色的工具的原因。它将允许您为每个项目拥有一组单独的 gem,这样您就不必担心再次发生这种情况。

标签: ruby rubygems bundler


【解决方案1】:

刚用过:bundle update

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

【讨论】:

    【解决方案2】:

    您不妨删除 Gemfile.lock 文件并运行 bundle install 或只是bundle,然后再试一次。

    【讨论】:

      【解决方案3】:

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

      rake :
          bundle exec rake
      

      【讨论】:

        【解决方案4】:

        试试bundle clean --force

        它会删除不在此捆绑包中的所有系统 gem

        【讨论】:

          【解决方案5】:

          如果您有理由保留当前版本 rake(或任何其他导致问题的 gem),matt 是正确的,最好的方法是运行 @987654323 @。这将使用您的 Gemfile 中指定的版本,而不是使用您已安装的最新版本的 gem。 (nathan.f77 有一个很好的解决方案 below,如果你不想每次运行 rake 时都输入 bundle exec

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

          bundle update rake
          

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

          注意:如果您只运行bundle update,这将更新您的 Gemfile 中的所有 gem 而不仅仅是 rake,这可能不是您想要的,因为如果您的应用程序出现问题,您不知道是哪个 gem 更新引起的。


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

          $ gem 卸载 rake 选择要卸载的 gem: 1. rake-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。
          • bundle update 还会将任何未指定版本的 gem 更新为可用的最新版本。那可能不是你想要的。 bundle update rake 会更珍贵。
          • 我对@9​​87654333@ 而不是rake 有同样的问题。不幸的是,运行bundle update public_suffix 没有效果。
          【解决方案6】:

          使用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 "$@"
          }
          

          【讨论】:

          • 这篇博文并没有真正解释太多。真正的问题是:为什么原始 ruby​​ 没有获得 正确 依赖项,为什么 then 抱怨有错误的依赖项?
          【解决方案7】:

          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] 中。每次打开新的终端窗口时都会加载此文件。
          【解决方案8】:

          哦! Katz 的文章很棒!

          我最喜欢这个解决方案:

          bundle install --binstubs
          

          以便您现在可以输入

          bin/rake .stuff.
          

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

          【讨论】:

            【解决方案9】:

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

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

            【讨论】:

              猜你喜欢
              • 2017-08-22
              • 2015-09-19
              • 2015-10-24
              • 2011-11-11
              • 2017-08-29
              • 2011-09-07
              • 2011-08-30
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多