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
Gemfilepour 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 :
- Lire le
Gemfile. - Calculer toutes les dépendances et sous-dépendances.
- Installer les versions compatibles de chaque gem.
- 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 leGemfile.locket 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
Gemfilepour 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 updatede temps en temps pour mettre à jour vos dépendances de manière contrôlée.
Exercices
-
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 unGemfilede base.
- Créez un nouveau dossier
-
Ajouter des dépendances :
- Modifiez le
Gemfilepour y ajoutergem 'colorize'. - Lancez
bundle install. Observez la création duGemfile.lock.
- Modifiez le
-
Utiliser la gem :
- Créez un script
test_color.rbquirequire '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.
- Créez un script