TL;DR
Oui, utilisez verrouillage pessimiste ( ~>
) et spécifier un version sémantique jusqu'à la parcelle ( Major.minor.patch
) sur tous vos joyaux !
Discussion
Je suis surpris par le manque de clarté sur cette question, même les "experts du secteur" m'ont dit l'autre jour que Gemfile.lock
est là pour maintenir les versions des gemmes. C'est faux !
Vous voulez organiser votre Gemfile
de manière à ce que vous puissiez exécuter bundle update
à tout moment sans risquer de tout casser. Pour y parvenir :
-
Spécifiez une version de niveau patch pour toutes vos gemmes avec un verrouillage pessimiste. Ceci permettra bundle update
pour vous donner des correctifs, mais pas de changements de rupture.
-
Indiquez un ref
pour les gemmes de git
Le seul inconvénient de cette configuration est que lorsqu'une nouvelle version mineure/majeure d'une gemme est publiée, vous devez mettre la version à jour manuellement.
Scénario d'alerte
Pensez à ce qui se passe si vous ne verrouillez pas vos pierres précieuses.
Vous avez un appareil non verrouillé gem "rails"
dans votre gemfile et la version dans Gemfile.lock
es 4.1.16
. Vous êtes en train de coder et à un moment donné, vous faites un bundle update
. Maintenant, votre version de Rails passe à 5.2.0
(à condition qu'une autre gemme ne l'empêche pas) et tout se casse la figure.
Faites-vous une faveur et ne permettez pas cela pour n'importe quel bijou !
Un exemple de 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
Une concession
Si vous êtes sûr que vos tests vont attraper les bogues introduits par les changements de version des gemmes, vous pouvez essayer de verrouiller les gemmes de façon pessimiste à la version mineure, et non au patch.
Cela permettra à la version de la gemme d'augmenter dans la version majeure spécifiée, mais jamais dans la suivante.
gem "puma", "~> 3.12"
0 votes
Je le ferais. Moins il y a de surprises, mieux c'est. Il suffit d'une seule fois qu'une dépendance se mette à jour sans que vous le fassiez intentionnellement pour vous envoyer dans un trou de lapin pendant des heures, voire des jours, pour que vous appreniez cette leçon. On ne peut pas faire confiance aux bibliothèques tierces et open-source pour suivre strictement le versionnement sémantique (même mes propres bibliothèques). Le risque n'en vaut pas la peine.