Lorsque j’ai appris l’existence des gemmes de rubis, elles semblaient assez magiques. En exécutant bundle install
, je pouvais en quelque sorte acquérir ces gemmes magiques qui feraient faire à mon code toutes sortes de choses qui semblaient bien au-delà de mes capacités d’étudiant Flatiron de la semaine 1. Un peu comme les » boîtes d’objets » dans Mario Kart, les gemmes semblent conférer des super pouvoirs à l’utilisateur.
J’ai l’intention d’utiliser mon blog pour approfondir les concepts de programmation qui piquent ma curiosité et que je ne comprends pas complètement. Pour mon premier billet de blog, je vais démystifier la nature mystique et magique des gemmes Ruby.
Qu’est-ce qu’une gemme Ruby?
Non, les gemmes Ruby ne sont pas magiques. Ils sont simplement des bibliothèques open source qui contiennent du code Ruby et sont emballés avec un peu de données supplémentaires . L’utilisation d’une gemme permet à un programmeur d’utiliser le code de la gemme dans son propre programme, sans insérer explicitement ce code.
Les gemmes peuvent être utilisées à toutes sortes de fins, et vous pouvez explorer différentes gemmes à https://rubygems.org/. Pour avoir une meilleure idée de ce que les gemmes peuvent faire, voici quelques gemmes populaires et leurs fonctionnalités :
- Bundler – Fournit un environnement cohérent pour les projets Ruby en suivant et en installant les gemmes et les versions exactes qui sont nécessaires. C’est la gemme #1 téléchargée de tous les temps, mais plus sur Bundler plus tard.
- RSpec – Un cadre de test qui prend en charge le développement guidé par le comportement pour Ruby.
- Devise – Devise fonctionne avec l’authentification. Pour tout site Web qui a besoin de se connecter à l’utilisateur, Devise gère l’inscription, l’inscription, la réinitialisation du mot de passe, etc.
- JSON – Fournit une API pour analyser JSON à partir de texte.
- Nokogiri – Fournit des analyseurs HTML, XML, SAX et Reader avec le support de XPath et des sélecteurs CSS.
- Rails – Rails est un bijou ! Rails fournit le framework fullstack qui permet de transformer Ruby en applications web.
Installation de gemmes
Aujourd’hui, utiliser des gemmes est facile ! L’installation de gems en local est aussi simple qu’une seule commande : gem install
. La commande install récupère le code, le télécharge sur votre ordinateur, et installe la gemme et toutes les dépendances nécessaires. Enfin, elle construit la documentation pour les gemmes installées.
Alors que certaines gemmes, comme Bundler, ne nécessitent que l’installation d’une gemme, d’autres gemmes ont des dépendances qui nécessitent l’installation de plusieurs gemmes :
Pour voir toutes les gems installées localement, utilisez la commande, gem list
.
Utilisation des gems
Maintenant, plus important, comment pouvons-nous utiliser nos gems installés ? Eh bien, cela dépend du type de gemme. Certaines gemmes, comme Rails, sont des programmes Ruby autonomes que vous pouvez exécuter à partir de la commande.
D’autres sont relativement inutiles en soi, mais incroyablement utiles lorsqu’elles sont utilisées dans un projet. Pour utiliser une gemme à partir de votre code, il est nécessaire de la requérir d’abord en haut du fichier – require 'gem_name'
. Par exemple, Pry est rapidement devenu l’une de mes gemmes préférées lorsque je travaille sur des projets. Mon code i̶s̶n̶’̶t̶ ̶a̶l̶w̶a̶y̶s̶ n’est presque jamais correct lorsque je l’écris pour la première fois, et Pry rend le débogage beaucoup plus efficace et un peu moins pénible. La semaine dernière, nous avons appris à connaître les API et avons eu besoin de Pry et de quelques autres gemmes pour compléter le projet.
Alors que les gemmes sont très simples si vous n’en avez besoin que sur votre ordinateur, elles deviennent légèrement plus compliquées si vous voulez distribuer ou publier votre projet. Toute autre personne qui exécute votre projet devra avoir toutes les gemmes nécessaires et les bonnes versions installées sur son ordinateur. Heureusement, nous avons RubyGems et Bundler qui rationalisent le processus.
RubyGems est le cadre qui simplifie le partage des gemmes
Une partie de la magie des gemmes est que nous pouvons tous les utiliser, et RubyGems est le gestionnaire de paquets qui rend cela possible. Il fournit un format standard pour distribuer les gemmes Ruby, gère l’installation des gemmes, et un serveur pour les distribuer. RubyGems n’a été rendu public que le 14 mars 2004 (jour de Pi ! π). Bien que RubyGems existe depuis Ruby 1.8, il n’a pas fait partie de la distribution standard de Ruby avant Ruby 1.9. Ainsi, pour les novices de Ruby, comme moi, RubyGems est automatiquement installé sur votre ordinateur lorsque vous installez Ruby.
Comment les rubyistes ont-ils pu vivre sans RubyGems ?
La vie était beaucoup plus difficile. Si vous voulez l’histoire complète, je vous recommande vivement de regarder la présentation d’André Arko « How does Bundler work, anyway ? » de la RailsConf 2015. Voici ma version résumée:
Le chargement du codage a commencé avec require
, et l’utilisation de require
est essentiellement la même que l’insertion du code dans votre fichier. Dans sa forme la plus simple, c’est une méthode qui extrait le code du fichier argument.
def require(filename)
eval File.name(filename)
end
Require permet aux utilisateurs de charger n’importe quel code local, en recherchant le fichier dans le $LOAD_PATH de l’utilisateur. $LOAD_PATH est une variable globale et un tableau de chemins absolus. Tant que le répertoire du code est situé quelque part dans le $LOAD_PATH, require
sera capable de le trouver.
Bien que require
soit génial pour le code local, que se passait-il si vous vouliez obtenir du code de quelqu’un d’autre ? C’était un processus fastidieux – vous deviez trouver le code, le télécharger, l’enregistrer quelque part sur votre ordinateur et ajouter cet endroit au $LOAD_PATH.
En conséquence, setup.rb a évolué pour faciliter le processus. Setup.rb (qui existe toujours aujourd’hui) est un installateur générique pour les scripts et les bibliothèques Ruby. C’était une amélioration majeure par rapport à require
, car il copiait tous les fichiers Ruby dans un répertoire qui se trouvait déjà dans le $LOAD_PATH. Les développeurs sont par nature paresseux, et setup.rb nous a fait gagner quelques étapes. Cependant, setup.rb avait son propre lot de problèmes. Il n’y avait pas de suivi de version et aucun moyen de désinstaller un programme ! La seule façon de savoir définitivement quelle version vous aviez était de noter le numéro de version à l’installation. Comme vous pouvez l’imaginer, l’utilisation des bibliothèques était un peu un désastre.
En 2004, RubyGems est venu à la rescousse ! Maintenant, le code d’autres personnes, ou gems, pouvait être installé ou désinstallé avec une seule commande ! C’était révolutionnaire. RubyGems avait un autre tour dans sa manche – il pouvait gérer différentes versions de logiciels, et chaque version était conservée dans son propre dossier séparé.
Bundler Solves Gem Dependencies
Aussi incroyable que RubyGems semblait, il avait un défaut inhérent. Si vous vouliez partager un projet, comment vous assurer qu’un nouvel utilisateur avait toutes les gemmes nécessaires ? Avec la configuration actuelle de RubyGems, si un développeur exécutait gem install foo
et commençait à utiliser une nouvelle gemme dans l’application, il fallait dire aux autres développeurs du projet d’exécuter gem install foo
. Certaines gemmes ne pouvaient fonctionner qu’avec certaines versions d’autres gemmes, et il devenait de plus en plus difficile de coordonner les dépendances entre gemmes et versions.
Alas, nous arrivons à Bundler ! Bundler existe pour résoudre le problème de la dépendance de version des gemmes en suivant et en installant les gemmes et les versions exactes qui sont nécessaires. Bundler fonctionne à travers le « gemfile » d’une gemme Ruby qui indique à Bundler quelles gemmes chercher et où les chercher. https://rubygems.org est la source par défaut, mais si des gems existent sur un serveur privé, cette source peut être écrasée pour ces gems spécifiques.
Après avoir installé les gemmes requises (si votre ordinateur ne les possède pas déjà), Bundler écrira toutes les gemmes et versions qu’il a installées dans un autre fichier, Gemfile.lock. Ce fichier de verrouillage permet d’installer exactement les mêmes versions sur chaque machine qui exécute l’application.
L’utilisation de Bundler est simple. Tout d’abord, il est nécessaire de l’installer, et comme Bundler est lui-même une gemme, nous pouvons le faire avec : gem install bundler
. Avec Bundler installé, vous pouvez utiliser n’importe quelle gemme dans votre propre projet en 2 étapes :
- Ajouter la gemme à un Gemfile dans la racine de votre projet
- Exécuter
bundle install
dans votre terminal
Pour plus de spécificités sur Bundler, consultez http://bundler.io/.
.