Gem Creation mit Bundler

Der Bau eines Edelsteins war früher eine komplexe Aufgabe, für die entweder genaue Kenntnis des Edelsteinformats selbst oder einige spezielle Werkzeuge zur Erzeugung einer geeigneten Heizplatte erforderlich waren. Heutzutage können wir den hervorragenden Bundler verwenden, um diese Komplexität zu beseitigen und die Menge an generiertem Code auf ein Minimum zu reduzieren.


Was wir bauen

Der Teststein, den wir bauen werden, ist ein Dummy-Inhaltsgenerator, den Sie während der Entwicklung verwenden könnten. Anstatt "Lorem ipsum" -Sätze zu generieren, verwendet er Bram Stokers Dracula, um eine beliebige Anzahl von Sätzen zu erzeugen, die aus dem Buch entnommen wurden. Unser Workflow beginnt mit der Generierung des Edelsteins, dem Testen und Implementieren der Mindestmenge an Code, die zur Vorbereitung des Edelsteins erforderlich ist, und die Veröffentlichung in RubyGems.


Generierung eines Skeletts

Ich gehe davon aus, dass Sie bereits eine Ruby-Umgebung eingerichtet haben. Für dieses Lernprogramm verwenden wir Ruby 1.9.3 als Basis. Wenn Sie jedoch planen, einen echten Edelstein zu entwickeln, kann es sinnvoll sein, ihn auch gegen Ruby 1.8 und andere Interpreter zu testen. Zu diesem Zweck ist ein Werkzeug wie Travis CI ein Glücksfall; Mit einer soliden Testsuite können Sie mit Travis Ihren Edelstein ohne Probleme auf einer Vielzahl von Plattformen testen. Beginnen wir mit der Generierung des Skeletts:

Bündel Edelstein Bramipsum

Es tut mir wirklich leid, wenn Ihnen der Name, den ich gewählt habe, nicht gefällt. In der Tat ist es eine der schwierigsten Aufgaben bei der Entwicklung eines Edelsteins, den richtigen Namen zu finden. Der Befehl erstellt ein Verzeichnis mit dem Namen Bramipsum mit ein paar Dateien:

Gemfile

Das Gemfile ist sehr minimal:

source 'http://rubygems.org' # Geben Sie die Abhängigkeiten Ihres Edelsteins in bramipsum.gemspec gemspec an

Beachten Sie, dass Sie eindeutig dazu aufgefordert werden, Ihre Edelsteinabhängigkeiten zu verschieben bramipsum.gemspec, um alle relevanten Daten für Ihren Edelstein in der Datei zu haben, die zum Auffüllen der Metadaten auf Rubygems verwendet wird.

bramipsum.gemspec

Das gemspec Datei enthält viele Informationen über unseren Edelstein; Wir können sehen, dass es stark darauf angewiesen ist Git um den Variablen, die eine Dateiliste beinhalten, die richtigen Werte zuzuweisen.

# - * - encoding: utf-8 - * - erfordert File.expand_path ('… / lib / bramipsum / version', __FILE__) Gem :: Specification.new do | gem | gem.authors = ["Claudio Ortolina"] gem.email = ["[email protected]"] gem.description =% q TODO: Schreibe eine Beschreibung des Gemisches gem.summary =% q TODO: Schreibe eine Zusammenfassung  gem.homepage = "" gem.executables = 'git ls-files - bin / *'. split ("\ n"). map | f | File.basename (f) gem.files = 'git ls-files'.split ("\ n") gem.test_files =' git ls-files - test, spez., Features / * '. Split (" \ n ") gem.name =" bramipsum "gem.require_paths = [" lib "] gem.version = Bramipsum :: VERSION gem.add_development_dependency 'rake' end

Als nächstes können wir rennen bündeln um Rake zu installieren. Da es als Entwicklungsabhängigkeit hinzugefügt wurde, wird es nicht von Bundler installiert, wenn jemand unseren Edelstein verwendet.

Einige interessante Anmerkungen zur Datei:

  • Es enthält den Eröffnungskommentar von Ruby 1.9, der die Dateikodierung angibt. Dies ist wichtig, da einige Daten in der Datei (wie die E-Mail oder der Name des Autors) ein Nicht-ASCII-Zeichen sein können.
  • Beschreibung und Zusammenfassung müssen geändert werden, um auf Rubygems korrekt angezeigt zu werden.
  • Die Version wird innerhalb von definiert lib / bramipsum / version Datei, oben erforderlich. Es definiert die AUSFÜHRUNG Konstante, die direkt vor dem Ende der Datei aufgerufen wird.

Der lib-Ordner

Das lib Ordner enthält ein generisches bramipsum.rb Datei, die das benötigt Ausführung Modul. Selbst wenn der Kommentar in der Datei nahelegt, dass Sie Code direkt in die Datei selbst einfügen, verwenden wir ihn nur, um die separaten Klassen zu benötigen, die unser kleines Juwel bilden.


Aktualisieren der Basisdaten und Hinzufügen eines Test-Frameworks

Beginnen wir mit der Aktualisierung der Daten in bramipsum.gemspec:

… Gem.description =% q Zufällige Sätze aus Bram Stokers Dracula gem.summary =% q Erzeugen Sie einen oder mehrere Dummy-Sätze aus Bram Stokers Dracula… 

Sehr einfaches Zeug. Als Nächstes fügen wir Unterstützung für das Testen hinzu. Wir werden verwenden Minitest, da es standardmäßig in Ruby 1.9 enthalten ist. Fügen wir ein Prüfung Verzeichnis:

mkdir test

Als nächstes brauchen wir eine test_helper.rb Datei und ein Test für das Vorhandensein der Bramipsum :: VERSION Konstante.

touch test / test_helper.rb mkdir -p test / lib / bramipsum touch test / lib / bramipsum / version_test.rb

Lass uns die öffnen test_helper.rb Datei und fügen Sie ein paar Zeilen hinzu:

erfordern 'minitest / autorun' erfordern 'minitest / pride' erfordern File.expand_path ('… /… /lib/bramipsum.rb', __FILE__)

Es erfordert sowohl Minitest als auch Stolz für die farbige Ausgabe. dann benötigt es die Hauptbramipsum-Datei.

Das version_test.rb Die Datei muss mit dem folgenden Code aktualisiert werden:

required_relative '… /… / test_helper' beschreiben Bramipsum do "muss definiert werden" do Bramipsum :: VERSION.wont_be_nil end end

Wir verwenden das Erwartungsformat für unsere Tests. Der Test selbst ist ziemlich selbsterklärend und kann einfach durch Eingabe des Befehls ausgeführt werden:

Rubintest / lib / bramipsum / version_test.rb

Du solltest einen Pass bestehen!

Lassen Sie uns jetzt das aktualisieren Rakefile eine bequemere Möglichkeit, unsere Tests durchzuführen. Alles löschen und folgenden Code einfügen:

#! / usr / bin / env Rake erfordert "Bundler / Gem_tasks" erfordert "Rake / TestTask". Rake :: TestTask.new do | t | t.libs << 'lib/bramipsum' t.test_files = FileList['test/lib/bramipsum/*_test.rb'] t.verbose = true end task :default => :Prüfung

Dadurch können wir unsere Tests durch Tippen ausführen Rechen aus dem gem root-Ordner.


Funktionalität hinzufügen

Da der Schwerpunkt dieses Tutorials auf der Erstellung eines Edelsteins liegt, werden wir die Menge an Funktionalität einschränken, die wir hinzufügen werden.


Basisklasse

Bramipsum ist immer noch eine leere Hülle. Da wir Draculas Buch zur Erzeugung von Sätzen verwenden wollen, ist es Zeit, es dem Repository hinzuzufügen. Ich habe eine Version des Buches vorbereitet, in der ich den Inhalt entfernt habe, mit Ausnahme der Geschichte selbst: fügen wir ihn dem Projekt hinzu.

mkdir -p book curl https://raw.github.com/cloud8421/bundler-gem-tutorial/master/book/dracula.txt -o book / dracula.txt

Lassen Sie uns jetzt ein erstellen Base Klasse, wobei alle Methoden hinzugefügt werden, um Daten aus dem Buch zu extrahieren.

Tippen Sie auf lib / bramipsum / base.rb. tippen Sie auf test / lib / bramipsum / base_test.rb

Die Testdatei wird nur einige Erwartungen haben:

required_relative '… /… / test_helper' beschreiben Bramipsum :: Base do subject Bramipsum :: Base beschreiben "das Lesen aus der Datei" do it "muss eine Quelle haben" do subject.must_respond_to (: source) ende es "muss die Dracula haben Datei als Quelle "do subject.source.must_be_instance_of (String) end end beschreiben" Aufteilen in Zeilen "do it" muss die Datei korrekt in Zeilen aufteilen "do subject.processed_source.must_be_instance_of (Array) ende es muss leere Zeilen korrekt entfernen "do subject.processed_source.wont_include (nil) end end end

Laufen Rechen Jetzt wird eine Ausnahme angezeigt, wie die base.rb Die Datei ist noch leer. Base liest einfach den Inhalt der Datei und gibt ein Zeilenfeld zurück (das Entfernen der leeren Zeilen).

Die Implementierung ist sehr unkompliziert:

Klasse Bramipsum Klasse Basis def self.source @source || = self.read Ende def self.processed_source @processed_source || = self.source.split ("\ n"). uniq end private def self.read File.read (Datei .expand_path ('book / dracula.txt')) end end end

Wir definieren eine Reihe von Klassenmethoden, die den ursprünglichen Text und eine verarbeitete Version enthalten, und speichern die Ergebnisse nach dem ersten Durchlauf.

Wir müssen dann öffnen lib / bramipsum.rb und fügen Sie die richtige Anweisung hinzu:

required_relative "./bramipsum/base"

Wenn Sie speichern und ausführen Rechen Jetzt sollten Sie alle Tests bestanden sehen.


Satzklasse

Als Nächstes müssen wir eine neue Klasse hinzufügen, um Sätze zu generieren. Wir werden es nennen Satz.

Tippen Sie auf lib / bramipsum / satz.rb. touch test / lib / bramipsum / satz_test.rb

Nach wie vor müssen wir öffnen lib / bramipsum.rb und erfordern die neu erstellte Datei:

Required_relative "./bramipsum/base" Required_relative "./bramipsum/sentence"

Diese Klasse wird von erben Base, So können wir die Implementierung minimal halten. Der Test benötigt nur drei Erwartungen:

required_relative '… /… / test_helper' beschreiben Bramipsum :: Satz unterziehen Bramipsum :: Satz es muss einen zufälligen Satz zurückgeben "do subject.sentence.must_be_instance_of (String) Ende es" muss standardmäßig 5 Sätze zurückgeben "muss den Betreff zurückgeben .sentences.size.must_equal (5) end es "muss die angegebene Anzahl von Sätzen zurückgeben" für subject.entents (10) .size.must_equal (10) end end

Die Idee ist, dass wir anrufen können Bramipsum :: Satz oder Bramipsum :: Urteilssätze (10) das erzeugen, was wir brauchen.

Der Inhalt für Satz.rb ist auch sehr knapp:

Modul Bramipsum-Klasse Satz < Base def self.sentence self.processed_source.sample end def self.sentences(n=5) self.processed_source.sample(n) end end end

Da wir mit Ruby 1.9 arbeiten, können wir die Probe Methode, um ein zufälliges Element aus einem Array zurückzugeben.

Wieder rennen Rechen sollte alle Tests zeigen, die bestanden haben.


Edelstein bauen und verteilen

Wenn du läufst Edelstein bauen Von der Befehlszeile aus wird eine lokale Kopie des Edelsteins für Sie erstellt und verpackt. Wenn Sie es nicht verteilen müssen oder es privat bleiben müssen, können Sie hier aufhören. Aber wenn es sich um ein Projekt handelt, das Sie als Open Source nutzen können, ermutige ich Sie, dies zu tun.

Der naheliegendste Schritt ist, RubyGems.org unser brandneues Juwel hinzuzufügen.

Nachdem Sie auf der Website ein Konto erstellt haben, besuchen Sie Ihr Profil. Sie finden einen Befehl, den Sie ausführen müssen, um Ihren Computer zu autorisieren. In meinem Fall war es:

curl -u cloud8421 https://rubygems.org/api/v1/api_key.yaml> ~ / .gem / Berechtigungsnachweise

Sie sind jetzt nur noch einen Schritt entfernt, um das Juwel auf Rubygems zu veröffentlichen. Tun Sie es jedoch nur, wenn Sie es wirklich wollen. Der Befehl, den Sie ausführen würden, lautet:

gem push bramipsum-0.0.1.gem

Fazit

Herzliche Glückwünsche! Sie wissen jetzt, wie Sie mit Bundler einen Edelstein von Grund auf erstellen. Es gibt jedoch noch andere Dinge zu beachten:

  • Kompatibilität: Möglicherweise möchten Sie auch Ruby 1.8 unterstützen. Dies erfordert das Umgestalten aller required_relative Anrufe; Zusätzlich müssen Sie die Minitest gem, da es nicht standardmäßig in Ruby 1.8 enthalten ist
  • Kontinuierliche Integration: Sie können Travis CI unterstützen und Ihr Edelstein wird in der Cloud gegen alle wichtigen Ruby-Releases getestet. Dadurch wird es einfacher, sicherzustellen, dass bei plattformspezifischen Verhaltensänderungen keine Probleme auftreten.
  • Dokumentation: Dies ist wichtig, es ist gut, über RDoc-Kommentare zu verfügen, die beim Generieren automatischer Dokumente und einer guten README-Datei mit Beispielen und Richtlinien helfen können.

Danke fürs Lesen! Irgendwelche Fragen?