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卸载后如何运行?
你的答案中的诊断似乎是正确的.但似乎可以激活安装最新的捆扎机宝石(通过安装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,则抛出派生异常.
好的,我想我们已经解决了。
事实证明,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,则不在乎。因此,过去大概没有较老的标准库捆绑程序就成为问题。
但是现在。因此,我认为可能采取三种补救措施:
bundle exec而应使用。rm -rf /usr/local/lib/ruby/2.6.0/bundler*。这似乎对我们有用,但是YMMV显然。(如果捆绑程序必须在标准库中进行引导,则不知道为什么最后一种可行。)
无论如何,希望可以帮助他人在类似情况下节省一些时间。
| 归档时间: |
|
| 查看次数: |
3023 次 |
| 最近记录: |