好的,我想我们已经解决了这个问题。
事实证明,Ruby 是通过安装捆绑程序“捆绑”的。在我们的例子中,它存储在/usr/local/lib/ruby/2.6.0/
所有标准库的旁边。这个版本显然是 bundler 的 1.17.2。
如果我们运行,则不使用此版本,bundle exec
因为它调用(在我们的设置中)可执行文件/usr/local/bundle/bin/bundle
- 它使用 rubygems 安装,即 2.0.1。
但是,调用bin/rails
或类似的 binstubs 不会发生这种情况。这些捆绑器生成的存根具有以下行:
require_relative '../config/boot'
好的,好的,听起来不错。config/boot.rb
然后做:
require 'bundler/setup'
看起来也无伤大雅。但这不会影响 rubygems 安装。我想也许它不能?因为那是让 bundler 设置的行,$LOAD_PATH
以便实际使用 bundle 中指定的 gem。
因此,它没有点击 bundler (2.0.1) 的 rubygems 安装,而是点击了标准库安装 (1.17.2)。这吓坏了,因为它可以看到这对它Gemfile.lock
来说太新了。
这种可怕的事情显然只是从 v2 的 bundler 开始的。如果它是 1.16 的 bundler 在 1.17.2 的 Gemfile.lock 上运行,它不会在意。因此,拥有一个稍旧的标准库捆绑器在过去可能不是问题。
但现在是。所以我想三种可能的补救措施:
- 在使用标准库中的 bundler v2 附带的 Ruby 版本之前,不要将 bundler 升级到 v2。
- 升级捆绑器,但不要使用 binstubs,
bundle exec
而是使用。
- 安装后删除标准库捆绑器:
rm -rf /usr/local/lib/ruby/2.6.0/bundler*
. 这似乎对我们有用,但显然是 YMMV。
(不知道为什么最后一个有效,如果捆绑器需要在标准库中进行引导。)
无论如何,希望能帮助其他人在类似情况下节省一些时间。