ОК, я думаю, мы с этим разобрались.
Оказывается, Ruby поставляется в комплекте с установкой bundler. В нашем случае он хранится в /usr/local/lib/ruby/2.6.0/
рядом со всеми стандартными библиотеками. Эта версия, по-видимому, 1.17.2 из пакета.
Эта версия не используется, если мы запускаем bundle exec
, потому что это вызывает (в нашей настройке) исполняемый файл /usr/local/bundle/bin/bundle
- который использует установку rubygems, которая является 2.0.1.
Однако, вызывая bin/rails
или подобные binstubs, это не то, что происходит. Эти сгенерированные сборщиком заглушки имеют строку:
require_relative '../config/boot'
ОК, хорошо, звучит хорошо. config/boot.rb
затем делает:
require 'bundler/setup'
Выглядит также безобидно. Но это не касается установок rubygems. Я думаю, может быть, это не может? Потому что это строка, которая заставляет компоновщик настроить $LOAD_PATH
так, чтобы гемы, указанные в пакете, фактически использовались.
Таким образом, вместо установки пакета rubygems (2.0.1), он выполняет установку стандартной библиотеки (1.17.2). Что волнует, потому что он видит, что Gemfile.lock
слишком новый для него.
Это волнение началось только с v2 пакета. Если бы это был пакет 1.16, запущенный на Gemfile.lock с 1.17.2, это не заботило бы. Таким образом, наличие немного более старого стандартного пакета библиотеки, вероятно, не было проблемой в прошлом.
Но это сейчас. Итак, я предполагаю три возможных исправления:
- Не обновляйте bundler до v2, пока вы не используете версию Ruby, которая поставляется с bundler v2 в стандартной библиотеке.
- Обновите упаковщик, но не используйте binstubs, вместо этого используйте
bundle exec
.
- Удалить стандартный пакет библиотеки после установки:
rm -rf /usr/local/lib/ruby/2.6.0/bundler*
. Кажется, это работает для нас, очевидно, YMMV.
(Понятия не имею, почему это последнее работает, если необходимо, чтобы упаковщик был в стандартной библиотеке для начальной загрузки.)
В любом случае, надеюсь, что это поможет другим сэкономить время в подобной ситуации.