Ruby Gems, Gemfile & Bundler (The Ultimate Guide)

Was ist ein Ruby-Gem?

Ein Gem ist ein Paket, das man herunterladen &und installieren kann. Wenn du ein installiertes Gem benötigst, fügst du deinem Ruby-Programm zusätzliche Funktionen hinzu.

Gems ermöglichen dir:

  • ein Login-Feature zu deiner Rails-Anwendung hinzuzufügen
  • einfaches Arbeiten mit externen Diensten (wie APIs)
  • eine Web-Anwendung zu erstellen

Das sind nur einige Beispiele. Jedes Gem hat sein eigenes Ziel.

Warum benutzen wir Gems?

  • So teilen wir Bibliotheken &Werkzeuge in Ruby
  • Die Dateistruktur & eines Gems macht es einfach zu verstehen, wie sie funktionieren
  • Eine Spezifikationsdatei („.spec“), die mit jedem Gem mitgeliefert wird, beschreibt Abhängigkeiten (andere benötigte Gems), so dass der Code alles hat, was er braucht, um zu funktionieren

Dank RubyGems haben wir ein reichhaltiges Ökosystem von hilfreichen Bibliotheken, die nur einen gem install Schritt entfernt sind!

Eine Liste von Gems, die für ein bestimmtes (nicht-gem) Projekt benötigt werden, kann in einer speziellen Datei namens „Gemfile“ aufgelistet werden, so dass sie automatisch von Bundler installiert werden können. Beides wird später in diesem Handbuch behandelt.

Was sind einige Beispiele für Gems?

  • Rails und alle seine Komponenten (ActiveRecord, ActiveSupport, etc.) werden als Ruby-Gems vertrieben
  • Pry, die leistungsstarke Alternative zu irb
  • Nokogiri, ein beliebter XML & HTML-Parser

Die meisten Gems sind reiner Ruby-Code.

Ein paar Gems enthalten eine Ruby-C-Erweiterung für verbesserte Leistung.

Diese Erweiterung wird automatisch für Sie erstellt, wenn Sie das Gem installieren. In manchen Fällen musst du zusätzliche Software, die nicht von RubyGems verwaltet wird, manuell installieren.

Jetzt:

Lerne mehr über Gems, indem du dein eigenes & baust und dir die Dateien ansiehst, die ein Gem ausmachen.

Wie man ein RubyGem baut

Du kannst die Dateien für ein neues Gem vorbereiten, indem du bundle gem <name> ausführst.

Zum Beispiel:

bundle gem awesome_gem

Ein Gem besteht aus der folgenden Struktur:

├── awesome_gem.gemspec├── bin│ ├── console│ └── setup├── Gemfile├── lib│ ├── awesome_gem│ │ └── version.rb│ └── awesome_gem.rb├── Rakefile├── README.md└── test ├── awesome_gem_test.rb └── test_helper.rb

In dieser .gemspecDatei findest du alle Informationen über den Gem.

Sie enthält:

  • Name des Gems
  • Zusammenfassung des Gems (kurze Beschreibung)
  • Name des Autors
  • Abhängigkeitsliste
  • Eine Liste der Dateien, die in das Gem eingebunden werden sollen
  • Optional: E-Mail-Adresse des Autors, Projekt-URL (Homepage), ausführbare Dateien, c-Erweiterungen, lange Beschreibung.

Die gem-Version selbst wird als Konstante in lib/<gem_name>/version.rb definiert.

Hier ist ein Beispiel für eine gemspec:

Gem::Specification.new do |spec| spec.name = "awesome_gem" spec.version = AwesomeGem::VERSION spec.authors = spec.summary = "Example gem for article about Ruby gems" spec.files = Dir.grep_v(/.gem$/) spec.require_paths = spec.add_development_dependency "bundler", "~> 1.16" spec.add_development_dependency "rake", "~> 10.0" spec.add_development_dependency "minitest", "~> 5.0"end

Das require_paths-Array ist der Ort, an dem Ruby nach deinen gem-Dateien sucht, wenn du sie brauchst. So kannst du deinen Code unter lib/<gem_name>/ & ablegen und ihn dann mit require "<gem_name>/<file_name>" anfordern.

Zum Beispiel:

Eine Datei mit dem Namen lib/awesome_gem/parser.rb würde als require "awesome_gem/parser" von irgendwo innerhalb des Gems angefordert werden.

Die meisten deiner Requests wirst du in lib/<gem_name>.rb haben (die einzige Datei in der Wurzel von /lib).

Das ist die Datei, die geladen wird, wenn du require das Gem lädst!

Weiter:

Die add_development_dependency Zeilen definieren Gems, die du während der Entwicklung benutzen wirst.

Das sind Gems wie minitest, RSpec oder pry.

Während add_dependency Gems definiert, die du als Teil deines Codes benutzt.

Nachdem du die Beschreibung der Zusammenfassung & von den Standardwerten abweichend geändert hast, kannst du eine irb-Sitzung mit deinem Edelstein laden, indem du das bin/console Programm benutzt, das bundle gem für dich erstellt.

Beispiel:

$ bin/consoleirb(main):001:0>irb(main):002:0>irb(main):003:0> AwesomeGem=> AwesomeGemirb(main):004:0>irb(main):005:0> AwesomeGem::VERSION=> "0.1.0"

Dann kannst du den Edelstein mit gem build <name>.gemspec verpacken & und ihn mit gem push auf rubygems.org veröffentlichen.

Was ist Bundler?

Während du über Ruby-Gems lernst, wirst du vielleicht auch über Bundler lesen.

Aber was ist Bundler genau?

Bundler ist ein Werkzeug für die Verwaltung von Abhängigkeiten.

Hat RubyGems dies nicht schon erledigt?

Nun, es tut es… aber nur für die Gems selbst.

Deine normale Ruby-Anwendung ist nicht als Gem gebaut, also bekommt sie diese Funktion nicht.

Dafür gibt es Bundler!

Gemfiles verstehen

Hast du diese Gemfile-Dateien gesehen?

Dort schreibst du, welche Gems du für deine Ruby-Anwendung verwenden willst.

Diese Gems werden dann für dich geladen, ohne dass du sie requirezur Hand nehmen musst.

Eine Gemfile sieht so aus:

ruby '2.5.0'gem 'rails', '~> 5.2.1'gem 'sqlite3'gem 'puma', '~> 3.11'gem 'bootsnap', '>= 1.1.0', require: false

Bundler (und RubyGems seit Version 2.0) kann diese Datei lesen &und die gewünschten Versionen dieser Gems installieren.

Das ist, was du sehen solltest, wenn du den bundle install Befehl ausführst:

Using turbolinks-source 5.1.0Using turbolinks 5.1.1Using uglifier 4.1.18Using web-console 3.6.2Bundle complete! 18 Gemfile dependencies, 78 gems now installed.Use `bundle info ` to see where a bundled gem is installed.

Nun:

Was sind diese Symbole (wie ~>), die verwendet werden, wenn du die Versionen für jeden Edelstein in deiner Gemfile angibst?

Sie erlauben es dir, einen Bereich von Versionen anzufordern.

Du kannst Dinge sagen wie: „Ich möchte, dass die Version gleich oder größer als 1 ist.2, aber kleiner als 2.0“.

Das würde dann so aussehen:

gem 'puma', '~> 1.2'

Das ~> ist eine Abkürzung für diesen Bereich:

gem 'puma', '>= 1.2', '

In the case of , it means exactly this:

'>= 5.2.1', '

The more specific the version number is the more restricted the version range will be.

Gemfile Options & Gemfile.lock

You have a few options when requiring a gem inside a Gemfile.

For example:

You may want to pull a gem from a different source, like GitHub.

This is helpful when you need to use the latest version of the project, even if it hasn't been released on rubygems.org yet.

Here's an example:

gem "rails", git: "[email protected]:rails/rails.git"

Sie können eine branch-Option übergeben, um den Code aus einem Zweig zu verwenden, der nicht Master ist.

gem "awesome_print", git: "[email protected]:awesome-print/awesome_print.git", branch: "v2"

Eine andere Option, die Sie finden können, ist require: false.

Was bewirkt das?

Es sagt Bundler, dass es den Edelstein nicht automatisch für Sie voraussetzt. Das bedeutet, dass Sie es in Ihrem Code requirenachfragen müssen, wenn Sie es benötigen.

Dies wird für Gems verwendet, die nur einen begrenzten Anwendungsbereich haben.

Zum Beispiel:

Gems, die Sie in einem bestimmten Rake-Task verwenden, aber nicht in Ihren Rails-Controller-& Modellen. Der Vorteil ist, dass du Speicher in deinem App-Code sparst, weil du dieses Gem nur lädst, wenn du es brauchst.

Du kannst Gems auch nach Umgebung gruppieren.

Das bedeutet, dass du Gems haben kannst, die nur & installiert sind und in der Entwicklung geladen werden (wie capybara & pry).

Schließlich erstellt Bundler eine Gemfile.lock.

Was ist der Unterschied?

Eine Gemfile.lock wird automatisch generiert & und sagt genau, welche Versionen von jedem Edelstein installiert wurden.

Bundler wird diese Versionen installieren, so dass, wenn Sie diese Anwendung in Produktion geben oder Ihr Projekt mit anderen Entwicklern teilen, jeder mit einem identischen Satz von Gems arbeiten wird.

Nützliche Gem & Bundler-Befehle

Befehl Beschreibung
gem list Liste aller installierten Gems. Akzeptiert ein Argument zum Filtern von Edelsteinen nach Namen (Beispiel: gem list active)
gem which <Name> Gibt den Pfad an, in dem ein Edelstein installiert ist.
gem search <Name> Sucht Edelsteine aus konfigurierten Quellen (Standard: rubygems.org). Nimmt einen regulären Ausdruck (Beispiel: gem search "\Aawesome_").
gem env Zeigt Informationen über Ihre Gem-Umgebung an (Version, Pfade, Konfiguration).
gem install <name> -v <version> Erlaubt die Installation einer bestimmten Gem-Version (Beispiel: gem install sinatra -v 2.0.0).
bundle viz Erzeugt eine Visualisierung des Abhängigkeitsgraphen für Ihr aktuelles Projekt.
bundle show Zeigt Informationen über einen bestimmten Gem, der über Bundler installiert wurde. Muss sich in einem Ordner mit einem Gemfile befinden.
bundle outdated Zeigt eine Liste der veralteten Gems im aktuellen Projekt an. Mit der Option --groups können sie gruppiert werden.
bundle console Stellt eine irb-Sitzung mit den Gems aus dem Gemfile des aktuellen Projekts dar.

Zusammenfassung

Sie haben RubyGems kennengelernt, das Paketsystem für Ruby. Du hast auch gelernt, wie ein Gem strukturiert ist, was ein Gemfile ist, Bundler & der Unterschied zwischen Gemfile & und Gemfile.lock.

Ich hoffe, du hast das nützlich gefunden!

Schreibe einen Kommentar

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