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.
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.
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:
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.
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:
Beschreibung
und Zusammenfassung
müssen geändert werden, um auf Rubygems korrekt angezeigt zu werden.lib / bramipsum / version
Datei, oben erforderlich. Es definiert die AUSFÜHRUNG
Konstante, die direkt vor dem Ende der Datei aufgerufen wird.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.
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.
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.
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.
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.
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
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:
required_relative
Anrufe; Zusätzlich müssen Sie die Minitest
gem, da es nicht standardmäßig in Ruby 1.8 enthalten istDanke fürs Lesen! Irgendwelche Fragen?