7

我们刚刚将 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卸载后如何运行?

4

5 回答 5

8

您答案中的诊断似乎是正确的。但似乎您可以通过在该行之前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_nameLoadError如果找不到 gem,则抛出派生异常。

于 2019-01-14T21:45:45.723 回答
5

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

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

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

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

require_relative '../config/boot'

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

require 'bundler/setup'

看起来也无伤大雅。但这不会影响 ruby​​gems 安装。我想也许它不能?因为那是让 bundler 设置的行,$LOAD_PATH以便实际使用 bundle 中指定的 gem。

因此,它没有点击 bundler (2.0.1) 的 ruby​​gems 安装,而是点击了标准库安装 (1.17.2)。这吓坏了,因为它可以看到这对它Gemfile.lock来说太新了。

这种可怕的事情显然只是从 v2 的 bundler 开始的。如果它是 1.16 的 bundler 在 1.17.2 的 Gemfile.lock 上运行,它不会在意。因此,拥有一个稍旧的标准库捆绑器在过去可能不是问题。

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

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

(不知道为什么最后一个有效,如果捆绑器需要在标准库中进行引导。)

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

于 2019-01-10T09:46:36.230 回答
2

如果有的话,这可能是 Bundler 本身的问题。

尝试以下步骤:

  • 删除现有的 Gemfile.lock

  • 更新 Rubygems:

    gem update --system

  • 重新生成 binstubs 版本

    bundle binstubs bundler

  • 捆绑安装

    bundle install

用来bundle exec [command]运行东西

于 2019-01-14T01:18:46.223 回答
1

您是否尝试过(ruby 2.6),

gem install bundler -v 1.17.0
于 2019-01-10T07:45:16.810 回答
0

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

于 2019-01-10T07:40:32.490 回答