Несоответствующая версия bundler - bundler 2, ruby ​​2.6 - PullRequest
0 голосов
/ 10 января 2019

Мы только что обновили 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, когда он был удален?

Ответы [ 5 ]

0 голосов
/ 15 января 2019

Диагноз в вашем ответе кажется правильным. Но, похоже, вы можете активировать последний установленный гем Bundler (установленный gem install bundler), добавив эту перед строкой require 'bundler/setup':

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

При необходимости можно использовать и более конкретные требования к версии. Например:

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

find_by_name выдает LoadError производное исключение, если камень не найден.

0 голосов
/ 14 января 2019

Во всяком случае, это может быть проблемой с самим Bundler.

попробуйте следующие шаги:

  • Удалить существующий Gemfile.lock

  • Обновление Rubygems:

    gem update --system

  • Версия регенерации binstubs

    bundle binstubs bundler

  • комплектация

    bundle install

используйте bundle exec [command] для запуска вещей

0 голосов
/ 10 января 2019

Вы пробовали с (ruby 2.6),

gem install bundler -v 1.17.0
0 голосов
/ 10 января 2019

ОК, я думаю, мы с этим разобрались.

Оказывается, 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.

(Понятия не имею, почему это последнее работает, если необходимо, чтобы упаковщик был в стандартной библиотеке для начальной загрузки.)

В любом случае, надеюсь, что это поможет другим сэкономить время в подобной ситуации.

0 голосов
/ 10 января 2019

Возможно, версия пакета написана в binstubs . Восстановите их, используя bundle binstubs GEM_NAME, и оно должно работать.

...