TL; DR
Да, используйте пессимистическую блокировку (~>
) и укажите семантическую версию вплоть до исправления (Major.minor.patch
) на всех ваших драгоценных камнях!
Обсуждение
Я удивлен отсутствием ясности в этом вопросе, даже «отраслевые эксперты» сказали мне на днях, что Gemfile.lock
существует для поддержки версий гемов. Неправильно!
Вы хотите организовать Gemfile
таким образом, чтобы вы могли запустить bundle update
в любое время, не рискуя сломать все. Чтобы достичь этого:
Укажите версию уровня патча для всех ваших драгоценных камней с пессимистической блокировкой. Это позволит bundle update
исправлять, но не вносить изменения.
Укажите ref
для драгоценных камней из git
Единственным недостатком этой настройки является то, что, когда выходит новая милая / основная версия для драгоценного камня, вы должны увеличить версию вручную.
Сценарий предупреждения
Подумайте, что произойдет, если вы не заблокируете свои драгоценные камни.
У вас есть разблокированный gem "rails"
в вашем гемфайле, а версия в Gemfile.lock
равна 4.1.16
. Вы пишете код, и в какой-то момент вы делаете bundle update
. Теперь ваша версия Rails переходит на 5.2.0
(при условии, что некоторые другие гемы не мешают этому) и все ломается.
Сделайте себе одолжение и не допускайте этого ни для какого драгоценного камня!
Пример Gemfile
# lock that bundler
if (version = Gem::Version.new(Bundler::VERSION)) < Gem::Version.new('1.16.3')
abort "Bundler version >= 1.16.3 is required. You are running #{version}"
end
source "http://rubygems.org"
# specify explicit ref for git repos
gem "entity_validator",
git: "https://github.com/plataformatec/devise",
ref: "acc45c5a44c45b252ccba65fd169a45af73ff369" # "2018-08-02"
# consider hard-lock on gems you do not want to change one bit
gem "rails", "5.1.5"
# pessimistic lock on your common gems
gem "newrelic_rpm", "~> 4.8.0"
gem "puma", "~> 3.12.0"
group :test do
gem "simplecov", "~> 0.16.1", require: false
end
Концессия
Если вы уверены, что ваши тесты обнаружат ошибки, вызванные изменениями версии гема, вы можете попробовать гемы с пессимистической блокировкой в минорной версии, а не в патче.
Это позволит увеличить версию гема в пределах указанной основной версии, но не до следующей.
gem "puma", "~> 3.12"