不匹配的捆绑器版本 - 捆绑器 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
- 使用 rubygems 安装 2.0.1。
但是,调用 bin/rails
或类似的 binstubs 不会发生这种情况。这些捆绑器生成的存根有一行:
require_relative '../config/boot'
好的,很好,听起来不错。 config/boot.rb
然后执行:
require 'bundler/setup'
看起来也无伤大雅。但这不会影响 rubygems 安装。我想也许它不能?因为这是让捆绑器设置 $LOAD_PATH
的行,以便实际使用捆绑包中指定的 gem。
因此,它不是点击捆绑器 (2.0.1) 的 rubygems 安装,而是点击标准库安装 (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
派生异常。
我们刚刚将 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
- 使用 rubygems 安装 2.0.1。
但是,调用 bin/rails
或类似的 binstubs 不会发生这种情况。这些捆绑器生成的存根有一行:
require_relative '../config/boot'
好的,很好,听起来不错。 config/boot.rb
然后执行:
require 'bundler/setup'
看起来也无伤大雅。但这不会影响 rubygems 安装。我想也许它不能?因为这是让捆绑器设置 $LOAD_PATH
的行,以便实际使用捆绑包中指定的 gem。
因此,它不是点击捆绑器 (2.0.1) 的 rubygems 安装,而是点击标准库安装 (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
派生异常。