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

问题描述 投票:5回答:5

我们刚刚将ruby更新为2.6,将bundler更新为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这样的bin/rails存根仍然失败。

如何在卸载时运行1.17.2

ruby-on-rails ruby bundler ruby-2.6
5个回答
6
投票

你的答案中的诊断似乎是正确的。但似乎你可以通过在gem install bundler行之前添加这个来激活最新安装的Bundler gem(由require 'bundler/setup'安装):

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

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

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

如果找不到宝石,find_by_name会抛出LoadError派生的异常。


5
投票

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

事实证明,Ruby与捆绑器的安装“捆绑”。在我们的例子中,它存储在/usr/local/lib/ruby/2.6.0/旁边所有标准库的东西。这个版本显然是捆绑器的1.17.2。

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

但是,调用bin/rails或类似的binstubs并非如此。这些捆绑器生成的存根具有以下行:

require_relative '../config/boot'

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

require 'bundler/setup'

看起来也无害。但这并没有打到rubygems安装。我猜也许它不可以?因为这是捆绑商设置$LOAD_PATH的线路,以便实际使用捆绑中指定的宝石。

因此,它没有点击Bundler(2.0.1)的rubygems安装,而是命中标准库安装(1.17.2)。哪个怪胎,因为它可以看出Gemfile.lock太新了。

这个吓人的事情显然只是从捆绑者的v2开始。如果在1.17.2的Gemfile.lock上运行的是捆绑器的1.16,它就不在乎了。因此,有一个稍微旧的标准库捆绑器可能在过去不是一个问题。

但它现在。所以我想三种可能的补救措施:

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

(不知道为什么最后一个工作,如果捆绑器需要在标准库中进行自举。)

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


1
投票

你试过(ruby 2.6),

gem install bundler -v 1.17.0

1
投票

如果有任何问题可能是Bundler本身的问题。

尝试以下步骤:

  • 删除现有的Gemfile.lock
  • 更新Rubygems: gem update --system
  • 重新生成binstubs版本 bundle binstubs bundler
  • 捆绑安装 bundle install

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


0
投票

Bundler版本可能写入binstubs。使用bundle binstubs GEM_NAME重新生成它们,它应该工作。

© www.soinside.com 2019 - 2024. All rights reserved.