Retour au cours

gems et bundler : gérer les dépendances

Objectifs

  • Comprendre ce qu’est une gem et le rôle de RubyGems.org.
  • Installer une gem simple avec la commande gem.
  • Comprendre pourquoi la gestion de dépendances est cruciale pour un projet.
  • Utiliser Bundler et le Gemfile pour gérer les dépendances d’un projet de manière reproductible.

L’un des plus grands atouts de Ruby est son écosystème de librairies open source. Ces librairies sont packagées sous forme de “gems”.

Qu’est-ce qu’une gem ?

Une gem est une librairie ou une application Ruby, packagée dans un format standardisé. Il en existe pour presque tout : faire des requêtes HTTP, se connecter à une base de données, parser du XML, colorer du texte…

RubyGems.org est le dépôt public officiel où la communauté publie et partage ces gems.

La commande gem

gem est l’outil en ligne de commande pour interagir avec ce système.

  • gem install <nom_de_la_gem> : Installe la dernière version d’une gem.
  • gem search <mot-cle> : Recherche une gem sur RubyGems.org.
  • gem list : Liste les gems installées sur votre machine.

Le problème : L’enfer des dépendances (“Dependency Hell”)

Installer des gems globalement avec gem install est pratique pour des outils en ligne de commande, mais pose un problème majeur pour les projets applicatifs :

  • Le Projet A a besoin de la librairie X en version 1.0.
  • Le Projet B, sur la même machine, a besoin de la librairie X en version 2.0. Comment gérer ce conflit ?

La solution : Bundler

Bundler est le gestionnaire de dépendances de facto de l’écosystème Ruby. Il résout ce problème en s’assurant que chaque projet a son propre ensemble de dépendances isolées.

1. Le Gemfile

À la racine de votre projet, vous créez un fichier nommé Gemfile (sans extension). C’est ici que vous déclarez les gems dont votre projet a besoin.

# Gemfile

# Source principale des gems
source 'https://rubygems.org'

# Version de Ruby recommandée pour ce projet
ruby '3.3.0'

# Dépendances de l'application
gem 'colorize', '~> 0.8' # On veut la version 0.8 ou une version patch plus récente
gem 'httparty'

# Dépendances uniquement pour les groupes de test et développement
group :development, :test do
  gem 'rspec'
  gem 'pry'
end

2. bundle install

Une fois le Gemfile créé, vous lancez cette commande dans votre terminal :

bundle install

Bundler va :

  1. Lire le Gemfile.
  2. Calculer toutes les dépendances et sous-dépendances.
  3. Installer les versions compatibles de chaque gem.
  4. Créer un fichier Gemfile.lock.

3. Le Gemfile.lock

Ce fichier est crucial. Il est généré automatiquement et contient la “photographie” exacte de toutes les gems et de leurs versions précises qui ont été installées.

  • Ce fichier doit être commité dans votre dépôt Git.
  • Lorsque qu’un autre développeur clone le projet et lance bundle install, Bundler lira le Gemfile.lock et installera exactement les mêmes versions de gems, garantissant un environnement de développement reproductible pour toute l’équipe.

4. bundle exec

Pour exécuter une commande (comme lancer votre script) en s’assurant d’utiliser les versions des gems spécifiées dans le Gemfile.lock, vous devez la préfixer avec bundle exec.

# Lance le script en utilisant l'environnement de Bundler
bundle exec ruby mon_script.rb

Bonnes pratiques

  • TOUJOURS utiliser Bundler et un Gemfile pour n’importe quel projet Ruby, même le plus petit.
  • Commitez votre Gemfile.lock. C’est la garantie de la reproductibilité.
  • Soyez aussi précis que possible sur les versions dans votre Gemfile ('~> 1.2' est mieux que rien).
  • Exécutez bundle update de temps en temps pour mettre à jour vos dépendances de manière contrôlée.

Exercices

  1. Créer un projet avec Bundler :

    • Créez un nouveau dossier mon_projet_bundle.
    • À l’intérieur, exécutez bundle init. Cela va créer un Gemfile de base.
  2. Ajouter des dépendances :

    • Modifiez le Gemfile pour y ajouter gem 'colorize'.
    • Lancez bundle install. Observez la création du Gemfile.lock.
  3. Utiliser la gem :

    • Créez un script test_color.rb qui require 'colorize' et affiche un texte en couleur.
    • Essayez de le lancer avec ruby test_color.rb. Cela pourrait échouer s’il ne trouve pas la gem.
    • Lancez-le avec bundle exec ruby test_color.rb. Cela doit fonctionner.