Was ist ein Ruby Gem?

Als ich das erste Mal von Ruby Gems erfuhr, erschienen sie mir ziemlich magisch. Indem ich bundle install ausführte, konnte ich irgendwie diese magischen Edelsteine erwerben, die meinen Code alle möglichen Dinge tun ließen, die weit über meine Fähigkeiten als Flatiron-Student der ersten Woche hinausgingen. Ähnlich wie die „Item-Boxen“ in Mario Kart scheinen Edelsteine dem Benutzer Superkräfte zu verleihen.

Ruby Gems geben dir magische Kräfte!

Ich beabsichtige, meinen Blog zu nutzen, um tiefer in Programmierkonzepte einzutauchen, die meine Neugier wecken und die ich nicht ganz verstehe. In meinem ersten Blogbeitrag werde ich die mystische, magische Natur von Ruby-Gems entlarven.

Was ist ein Ruby-Gem?

Nein, Ruby-Gems sind nicht magisch. Sie sind einfach Open-Source-Bibliotheken, die Ruby-Code enthalten und mit ein paar zusätzlichen Daten verpackt sind. Die Verwendung eines Gems ermöglicht es einem Programmierer, den Code des Gems in seinem eigenen Programm zu verwenden, ohne diesen Code explizit einfügen zu müssen.

Gems können für alle möglichen Zwecke verwendet werden, und Sie können verschiedene Gems unter https://rubygems.org/ erkunden. Um eine bessere Vorstellung davon zu bekommen, was Gems tun können, sind hier ein paar beliebte Gems und ihre Funktionen:

  • Bundler – Bietet eine konsistente Umgebung für Ruby-Projekte, indem es genau die Gems und Versionen aufspürt und installiert, die benötigt werden. Es ist das am häufigsten heruntergeladene Gem aller Zeiten, aber mehr zu Bundler später.
  • RSpec – Ein Test-Framework, das Behavior Driven Development für Ruby unterstützt.
  • Devise – Devise arbeitet mit Authentifizierung. Für jede Website, die Benutzer-Logins benötigt, handhabt Devise die Anmeldung, das Anmelden, das Zurücksetzen des Passworts usw.
  • JSON – Bietet eine API zum Parsen von JSON aus Text.
  • Nokogiri – Bietet HTML-, XML-, SAX- und Reader-Parser mit XPath- und CSS-Selektor-Unterstützung.
  • Rails – Rails ist ein Juwel! Rails bietet das Fullstack-Framework, mit dem Ruby in Webanwendungen umgewandelt werden kann.

Installation von Gems

Heute ist die Verwendung von Gems einfach! Die lokale Installation von Gems ist so einfach wie ein einziger Befehl: gem install . Der Installationsbefehl holt den Code, lädt ihn auf Ihren Computer herunter und installiert den Edelstein und alle notwendigen Abhängigkeiten. Schließlich wird die Dokumentation für die installierten Edelsteine erstellt.

Bundler zu installieren erfordert nur die Installation eines Edelsteins

Während einige Edelsteine, wie Bundler, nur die Installation eines Edelsteins erfordern, haben andere Edelsteine Abhängigkeiten, die die Installation mehrerer Edelsteine erfordern:

Die Installation von Draper erforderte auch die Installation der Gems Request Store und Active Model Serializers

Um alle lokal installierten Gems anzuzeigen, verwenden Sie den Befehl gem list .

Die Verwendung von Edelsteinen

Wie können wir nun unsere installierten Edelsteine verwenden? Nun, das hängt von der Art der Gems ab. Einige Gems, wie z.B. Rails, sind eigenständige Ruby-Programme, die man von der Kommandozeile aus starten kann.

Andere sind für sich genommen relativ nutzlos, aber unglaublich hilfreich, wenn sie innerhalb eines Projekts verwendet werden. Um einen Edelstein in Ihrem Code zu verwenden, müssen Sie ihn zuerst am Anfang der Datei anfordern – require 'gem_name' . Pry zum Beispiel ist schnell zu einem meiner Lieblingsgems bei der Arbeit an Projekten geworden. Mein Code i̶s̶n̶’̶t̶ ̶a̶l̶w̶a̶y̶s̶ ist fast nie korrekt, wenn ich ihn zum ersten Mal schreibe, und Pry macht die Fehlersuche viel effizienter und etwas weniger schmerzhaft. In der letzten Woche haben wir etwas über APIs gelernt und brauchten Pry und ein paar andere Gems, um das Projekt zu vervollständigen.

Während Gems sehr einfach sind, wenn man sie nur auf seinem Computer braucht, wird es etwas komplizierter, wenn man sein Projekt verteilen oder veröffentlichen will. Jeder andere, der Ihr Projekt ausführt, muss alle notwendigen Gems und die richtigen Versionen auf seinem Computer installiert haben. Zum Glück gibt es RubyGems und Bundler, die diesen Prozess vereinfachen.

RubyGems ist das Framework, das die gemeinsame Nutzung von Gems vereinfacht

Teil der Magie von Gems ist, dass wir sie alle nutzen können, und RubyGems ist der Paketmanager, der das möglich macht. Er bietet ein Standardformat für die Verteilung von Ruby-Gems, verwaltet die Installation von Gems und stellt einen Server für deren Verteilung bereit. RubyGems wurde erst am 14. März 2004 (Pi-Tag! π) der Öffentlichkeit zugänglich gemacht. Obwohl RubyGems seit Ruby 1.8 existiert, war es bis Ruby 1.9 nicht Teil der Standard-Ruby-Distribution. Für Ruby-Neulinge, wie mich, wird RubyGems also automatisch auf dem Computer installiert, wenn man Ruby installiert.

Wie konnten Rubyisten jemals ohne RubyGems leben?

Das Leben war viel schwieriger. Wenn ihr die ganze Geschichte hören wollt, empfehle ich euch André Arkos Präsentation „How does Bundler work, anyway?“ von der RailsConf 2015. Hier ist meine zusammengefasste Version:

Das Laden von Code beginnt mit require und die Verwendung von require ist im Wesentlichen dasselbe wie das Einfügen des Codes in Ihre Datei. In seiner einfachsten Form ist es eine Methode, die Code aus der Argumentationsdatei extrahiert.

def require(filename)
eval File.name(filename)
end

Require ermöglicht es dem Benutzer, jeden lokalen Code zu laden, indem er den $LOAD_PATH des Benutzers nach der Datei durchsucht. $LOAD_PATH ist eine globale Variable und ein Array von absoluten Pfaden. Solange sich das Verzeichnis des Codes irgendwo im $LOAD_PATH befindet, kann require ihn finden.

Während require für lokalen Code großartig ist, was wäre, wenn man Code von jemand anderem bekommen wollte? Das war ein mühsamer Prozess – man musste den Code finden, ihn herunterladen, ihn irgendwo auf dem Computer speichern und das irgendwo zum $LOAD_PATH hinzufügen.

Daraufhin wurde setup.rb entwickelt, um den Prozess zu vereinfachen. Setup.rb (das es auch heute noch gibt) ist ein allgemeines Installationsprogramm für Ruby-Skripte und -Bibliotheken. Es war eine große Verbesserung gegenüber require, weil es alle Ruby-Dateien in ein Verzeichnis kopierte, das sich bereits im $LOAD_PATH befand. Entwickler sind von Natur aus faul, und setup.rb hat uns ein paar Schritte erspart. Allerdings hatte setup.rb seine eigenen Probleme. Es gab keine Versionsverfolgung und keine Möglichkeit, ein Programm zu deinstallieren! Die einzige Möglichkeit, die Version festzustellen, bestand darin, die Versionsnummer bei der Installation zu notieren. Wie Sie sich vorstellen können, war die Verwendung von Bibliotheken ein ziemliches Desaster.

Im Jahr 2004 kam RubyGems zur Rettung! Jetzt konnte man den Code anderer Leute, also Gems, mit einem einzigen Befehl installieren oder deinstallieren! Das war revolutionär. RubyGems hatte noch einen weiteren Trick in petto: Es konnte mit verschiedenen Versionen von Software umgehen, und jede Version wurde in einem eigenen Ordner aufbewahrt.

Bundler löst Gem-Abhängigkeiten

So unglaublich RubyGems auch schien, es hatte einen inhärenten Makel. Wenn man ein Projekt weitergeben wollte, wie konnte man sicherstellen, dass ein neuer Benutzer alle erforderlichen Gems hatte? Wenn ein Entwickler gem install foo ausführte und ein neues Gem in der Anwendung verwendete, mussten die anderen Entwickler des Projekts angewiesen werden, gem install foo auszuführen. Bestimmte Gems konnten nur mit bestimmten Versionen anderer Gems zusammenarbeiten, und es wurde immer schwieriger, Gem- und Versionsabhängigkeiten zu koordinieren.

Also, wir kommen zu Bundler! Bundler soll das Problem der Gem-Versionsabhängigkeit lösen, indem es genau die Gems und Versionen aufspürt und installiert, die benötigt werden. Bundler arbeitet über die „gemfile“ eines Ruby-Gems, die Bundler mitteilt, welche Gems gesucht werden sollen und wo sie zu finden sind. https://rubygems.org ist die Standardquelle, aber wenn Gems auf einem privaten Server existieren, kann diese Quelle für diese spezifischen Gems überschrieben werden.

Beispiel Gemfile – Quelle: http://bundler.io/rationale.html

Nach der Installation der benötigten Gems (falls Ihr Computer sie nicht bereits hat), schreibt Bundler alle installierten Gems und Versionen in eine weitere Datei, Gemfile.lock. Diese Lock-Datei ermöglicht es, auf jedem Rechner, auf dem die Anwendung läuft, genau die gleichen Versionen zu installieren.

Die Verwendung von Bundler ist einfach. Zuerst muss es installiert werden, und da Bundler selbst ein Gem ist, können wir dies mit: gem install bundler . Wenn Bundler installiert ist, kann man jedes Gem in seinem eigenen Projekt in 2 Schritten verwenden:

  1. Hinzufügen des Gems zu einer Gemfile im Stammverzeichnis des Projekts
  2. Ausführen von bundle install im Terminal

Für weitere Bundler-Spezifika, siehe http://bundler.io/.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.