我们刚刚将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
?
你的答案中的诊断似乎是正确的。但似乎你可以通过在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
派生的异常。
好吧,我想我们已经解决了这个问题。
事实证明,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,它就不在乎了。因此,有一个稍微旧的标准库捆绑器可能在过去不是一个问题。
但它现在。所以我想三种可能的补救措施:
bundle exec
。rm -rf /usr/local/lib/ruby/2.6.0/bundler*
。这似乎对我们有用,YMMV显然是有用的。(不知道为什么最后一个工作,如果捆绑器需要在标准库中进行自举。)
无论如何,希望能帮助他人在类似的情况下节省一些时间。
你试过(ruby 2.6),
gem install bundler -v 1.17.0
如果有任何问题可能是Bundler本身的问题。
尝试以下步骤:
gem update --system
bundle binstubs bundler
bundle install
使用bundle exec [command]
来运行这些东西
Bundler版本可能写入binstubs。使用bundle binstubs GEM_NAME
重新生成它们,它应该工作。