不匹配的捆绑器版本 - 捆绑器 2,ruby 2.6

Mismatched bundler version - bundler 2, ruby 2.6

我们刚刚将 ruby 更新为 2.6,并将捆绑器更新为 2。现在我们得到:

# bin/rails console
You must use Bundler 2 or greater with this lockfile.

这以前发生在 bundle exec:

# bundle exec rails console
You must use Bundler 2 or greater with this lockfile.

那时我们默认还是运行1.17.2:

# gem list bundler

*** LOCAL GEMS ***

bundler (2.0.1, default: 1.17.2)

所以我们 运行 gem uninstall bundler --version 1.17.2 然后 bundle exec 开始工作。

但是像 bin/rails 这样的 bin 存根仍然失败。

卸载后怎么会是运行1.17.2

打包程序版本可能写入 binstubs。使用 bundle binstubs GEM_NAME 重新生成它们,它应该可以工作。

你试过 (ruby 2.6),

gem install bundler -v 1.17.0

好的,我想我们已经解决了这个问题。

事实证明 Ruby "bundled" 安装了捆绑器。在我们的例子中,它存储在所有标准库内容旁边的 /usr/local/lib/ruby/2.6.0/ 中。这个版本显然是 bundler 的 1.17.2。

如果我们 运行 bundle exec 则不使用此版本,因为它调用(在我们的设置中)可执行文件 /usr/local/bundle/bin/bundle - 使用 ruby​​gems 安装 2.0.1。

但是,调用 bin/rails 或类似的 binstubs 不会发生这种情况。这些捆绑器生成的存根有一行:

require_relative '../config/boot'

好的,很好,听起来不错。 config/boot.rb 然后执行:

require 'bundler/setup'

看起来也无伤大雅。但这不会影响 ruby​​gems 安装。我想也许它不能?因为这是让捆绑器设置 $LOAD_PATH 的行,以便实际使用捆绑包中指定的 gem。

因此,它不是点击捆绑器 (2.0.1) 的 ruby​​gems 安装,而是点击标准库安装 (1.17.2)。这吓坏了,因为它可以看到 Gemfile.lock 对它来说太新了。

这个问题显然是从 bundler 的 v2 开始的。如果它是来自 1.17.2 的 Gemfile.lock 上的捆绑器 运行 的 1.16,它不会在意。因此,过去使用稍旧的标准库捆绑器可能不是问题。

但现在是。所以我假设三种可能的补救措施:

  • 在使用标准库中 bundler v2 附带的 Ruby 版本之前,不要将 bundler 升级到 v2。
  • 升级捆绑器但不使用 binstub,而是使用 bundle exec
  • 安装后删除标准库捆绑器:rm -rf /usr/local/lib/ruby/2.6.0/bundler*。这似乎对我们有用,YMMV 显然。

(如果捆绑器需要在标准库中进行引导,不知道最后为什么有效。)

无论如何,希望能帮助其他人在类似情况下节省一些时间。

如果有的话,这可能是 Bundler 本身的问题。

尝试以下步骤:

  • 删除现有的Gemfile.lock

  • 更新 Rubygems:

    gem update --system

  • 重新生成 binstubs 版本

    bundle binstubs bundler

  • 捆绑安装

    bundle install

使用bundle exec [command]来运行东西

您的回答中的诊断似乎是正确的。但似乎您可以激活最新安装的 Bundler gem(由 gem install bundler 安装),方法是在 before require 'bundler/setup' 行中添加:

Gem::Specification.find_by_name('bundler').activate

如果需要,也可以使用更具体的版本要求。例如:

Gem::Specification.find_by_name('bundler', '~> 2.0.1').activate

find_by_name 如果找不到 gem,则抛出 LoadError 派生异常。