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

Dav*_*kin 7 ruby ruby-on-rails bundler ruby-2.6

我们刚刚将ruby更新为2.6,将bundler更新为2.现在我们得到:

# bin/rails console
You must use Bundler 2 or greater with this lockfile.
Run Code Online (Sandbox Code Playgroud)

以前发生过bundle exec:

# bundle exec rails console
You must use Bundler 2 or greater with this lockfile.
Run Code Online (Sandbox Code Playgroud)

那时我们默认仍然运行1.17.2:

# gem list bundler

*** LOCAL GEMS ***

bundler (2.0.1, default: 1.17.2)
Run Code Online (Sandbox Code Playgroud)

所以我们跑了gem uninstall bundler --version 1.17.2然后bundle exec开始工作.

但是bin存根bin/rails仍然是失败的.

1.17.2卸载后如何运行?

tma*_*lai 7

你的答案中的诊断似乎是正确的.但似乎可以激活安装最新的捆扎机宝石(通过安装gem install bundler加入这个)require 'bundler/setup'一行:

Gem::Specification.find_by_name('bundler').activate
Run Code Online (Sandbox Code Playgroud)

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

Gem::Specification.find_by_name('bundler', '~> 2.0.1').activate
Run Code Online (Sandbox Code Playgroud)

find_by_nameLoadError如果找不到gem,则抛出派生异常.


Dav*_*kin 5

好的,我想我们已经解决了。

事实证明,Ruby是通过安装捆绑程序来“捆绑”的。在我们的情况下,它存储在/usr/local/lib/ruby/2.6.0/所有标准库内容的旁边。该版本显然是捆绑程序的1.17.2。

如果我们运行该版本,则不会使用该版本,bundle exec因为它会(在我们的设置中)调用可执行文件/usr/local/bundle/bin/bundle-使用rubygems install为2.0.1。

但是,调用bin/rails或类似的binstub不会发生这种情况。这些捆绑程序生成的存根具有以下行:

require_relative '../config/boot'
Run Code Online (Sandbox Code Playgroud)

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

require 'bundler/setup'
Run Code Online (Sandbox Code Playgroud)

看起来也无害。但这不会影响rubygems的安装。我想可能不行吗?因为这是捆绑程序要设置的行,$LOAD_PATH以便实际上将使用捆绑程序中指定的宝石。

因此,它不会显示捆绑程序(2.0.1)的rubygems安装,而是会显示标准库安装(1.17.2)。哪个吓到了,因为它可以看到这Gemfile.lock太新了。

显然,这种怪胎只是从v2捆绑器开始的。如果它是在1.17.2的Gemfile.lock上运行的bundler的1.16,则不在乎。因此,过去大概没有较老的标准库捆绑程序就成为问题。

但是现在。因此,我认为可能采取三种补救措施:

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

(如果捆绑程序必须在标准库中进行引导,则不知道为什么最后一种可行。)

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