
Comment gérer les gems avec Bundler et le Gemfile
Maîtrisez l'outil incontournable de l'écosystème Ruby : Bundler. Ce guide vous apprend à créer un Gemfile, à installer vos gems avec `bundle install` et à comprendre le `Gemfile.lock`.
Quel problème fondamental Bundler résout-il ?
Imaginez que vous rejoignez une équipe travaillant sur un projet Ruby. Ce projet utilise une dizaine de bibliothèques externes (gems). Comment savoir lesquelles installer et, plus important encore, dans quelles versions exactes ? Si vous installez une version plus récente d'une gem, vous risquez d'introduire des bugs ou des incompatibilités qui n'existent pas sur les machines de vos collègues. C'est un véritable cauchemar pour la collaboration et la stabilité.
Bundler est la solution standard à ce problème en Ruby. C'est un gestionnaire de dépendances. Son rôle est de s'assurer que chaque personne travaillant sur un projet utilise précisément le même environnement, avec les mêmes gems aux mêmes versions. Il agit comme une recette de cuisine pour votre application : il liste tous les "ingrédients" (les gems) et leurs "quantités" (les versions) exactes, garantissant que le "plat" final (votre application) est identique pour tout le monde, à chaque fois.
Etape 1 : Déclarer les dépendances dans le Gemfile
La première étape pour utiliser Bundler est de créer un fichier nommé Gemfile (sans extension) à la racine de votre projet. Ce fichier, écrit en Ruby, est l'endroit où vous allez lister toutes les gems dont votre application a besoin.
Un Gemfile typique commence par déclarer la source des gems (presque toujours rubygems.org) et la version de Ruby utilisée. Ensuite, vous ajoutez chaque gem avec le mot-clé gem.
# Gemfile
# Indique la source principale où Bundler doit chercher les gems.
source 'https://rubygems.org'
# (Optionnel mais recommandé) Spécifie la version de Ruby du projet.
ruby '3.1.2'
# Déclare la gem 'httparty' pour faire des requêtes HTTP.
# Sans contrainte, Bundler installera la dernière version stable.
gem 'httparty'
# Déclare la gem 'rubocop' pour l'analyse de style de code.
# On spécifie ici une contrainte de version.
gem 'rubocop', '~> 1.25'Conseil pro : La notation '~> 1.25' est une contrainte pessimiste. Elle signifie "installe une version supérieure ou égale à 1.25, mais inférieure à 2.0". C'est une excellente pratique car elle autorise les mises à jour mineures (corrections de bugs) tout en empêchant une mise à jour majeure (version 2.0) qui pourrait casser votre code. C'est un compromis parfait entre stabilité et modernité.
Etape 2 : Installer les gems avec `bundle install`
Une fois votre Gemfile prêt, ouvrez votre terminal à la racine de votre projet et lancez une seule commande :
$ bundle installCette commande va déclencher plusieurs actions cruciales :
- Bundler lit votre
Gemfilepour connaître les gems que vous avez demandées. - Il se connecte à la source (rubygems.org) pour trouver les versions correspondantes.
- Il résout l'arbre des dépendances : si
httpartya besoin d'une autre gem pour fonctionner, Bundler la trouvera aussi. - Il télécharge et installe les versions exactes de toutes ces gems dans un emplacement spécifique à votre projet.
- Enfin, et c'est le plus important, il crée un fichier appelé
Gemfile.lock.
Le rôle du `Gemfile.lock` : la garantie de reproductibilité
Vous vous demandez peut-être à quoi sert ce nouveau fichier Gemfile.lock. Vous ne devez jamais le modifier à la main. Ce fichier est une "photographie" exacte de l'environnement que bundle install vient de créer. Il contient la liste de toutes les gems installées (y compris les sous-dépendances) avec leurs numéros de version précis.
C'est ici que la magie de Bundler opère. La prochaine fois que vous (ou un autre développeur) exécuterez bundle install, Bundler verra que le fichier Gemfile.lock existe. Au lieu de chercher les dernières versions autorisées par le Gemfile, il lira le Gemfile.lock et installera exactement les mêmes versions qui y sont listées. C'est ce qui garantit une reproductibilité parfaite de l'environnement sur n'importe quelle machine.
Pour cette raison, le fichier Gemfile.lock doit absolument être ajouté à votre système de contrôle de version (comme Git). Il est aussi important que votre propre code.
Comment utiliser les gems et les mettre à jour ?
Pour exécuter une commande fournie par une gem de votre projet (comme rspec pour les tests ou rubocop), il est recommandé de la préfixer avec bundle exec.
# Exécute la commande rubocop du projet, pas celle installée globalement
$ bundle exec rubocopCela garantit que vous utilisez bien la version de la gem définie dans votre Gemfile.lock, évitant ainsi les conflits avec d'autres versions qui pourraient être installées sur votre système.
Pour mettre à jour une gem, ne modifiez pas le Gemfile.lock. Utilisez plutôt la commande bundle update. Pour mettre à jour une seule gem (ce qui est plus sûr), précisez son nom :
# Met à jour la gem httparty à la dernière version autorisée par le Gemfile
$ bundle update httpartyCette commande mettra à jour la gem et régénérera le fichier Gemfile.lock avec la nouvelle version. Vous pourrez alors "commiter" ce fichier mis à jour pour que le reste de l'équipe bénéficie de cette nouvelle version.