Wie sollte ich mein Schmuckstück während der Entwicklung ausprobieren?

8

Nehmen wir an, ich habe ein Juwel namens foo mit einer Dateistruktur wie folgt:

%Vor%

Die Datei test_foo.rb enthält einen Code, mit dem ich mein Juwel ausprobiere. Es greift auf den Code des Edelsteins mit der folgenden Zeile zu:

%Vor%

Dann aktiviert lib/foo.rb die anderen für das Juwel erforderlichen Dateien wie folgt:

%Vor%

Da sich test_foo.rb im Wurzelverzeichnis des Gem-Verzeichnisses befindet, müssen die Dateien in lib/foo mit dem vollständigen Pfad vom Stammverzeichnis angefordert werden.

Das alles funktioniert gut, und ich kann sofort mit meinem Juwel herumspielen, indem ich den in test_foo.rb verwendeten Code ändere.

Wenn ich dann aber den Edelstein bauen möchte, muss ich dann meine Aufrufe in require ändern, so:

%Vor%

statt

%Vor%

Was jedes Mal mühsam ist, wenn ich den Edelstein bauen will.

Also dachte ich über eine andere Möglichkeit nach, es auszuprobieren, nämlich rake zu verwenden, um den Build und die Installation des Gems zu automatisieren, etwa so:

%Vor%

Wenn ich Änderungen an meinem Code vorgenommen habe und es ausprobieren wollte, starte einfach rake build und rufe require 'foo' in test_foo.rb auf.

Aber das ist ein ziemlich langsamer Prozess, und fühlt sich ein bisschen so an, als ob es den Punkt von Ruby als eine Sprache besiegt, in der Sie Ihren Code nicht aufbauen müssen, bevor Sie es ausprobieren.

Also, meine Frage ist, was ist der beste Workflow, den Sie verwenden müssen, wenn Sie ein Juwel aktiv entwickeln und ausprobieren?

    
Alex Coplan 09.06.2012, 09:36
quelle

3 Antworten

8

Es ist fehleranfällig und verwirrend, sich mit require Pfaden innerhalb Ihrer Quelldateien herumschlagen zu müssen, um den Code in verschiedenen Situationen laufen zu lassen (lokale Tests, "Produktion" als Edelstein usw.).

Es gibt einige Tricks, mit denen man "einmal schreiben, irgendwo rennen" kann (Entschuldigung Java, zum Stehlen). Dies ist auch das Ziel, das Sie erreichen sollten. Wenn Sie diese Standardmethoden verwenden, können andere Ihren Code leichter verstehen oder Ihnen helfen, wenn etwas nicht wie erwartet funktioniert.

Ihr Code folgt bereits dem allgemeinen Edelstein-Verzeichnis-Layout, hier muss nichts geändert werden. Als allgemeine Faustregel sollten Sie jedoch require zum Laden von "libraries" und require_relative (wenn Sie auf Ruby & gt; 1.9 arbeiten) verwenden, um Quelldateien zu laden, die sich auf die Datei beziehen, an der Sie gerade arbeiten.

>

1) Ihre Datei test_foo.rb sollte nur eine Zeile enthalten:

%Vor%

Das heißt, Sie lassen den './lib' Teil vom Required-Pfad weg. Der Einstiegspunkt für den Edelstein (der "request_path") wird üblicherweise als "lib" gewählt. Mehr dazu später (3).

2) Verwenden Sie als Nächstes in foo.rb require_relative (wieder unter der Annahme von Ruby 1.9), um die relativen Quelldateien einzufügen:

%Vor%

3) Um den request_path für dein Juwel auf lib zu setzen, ist es eine gute Übung, eine Gemspec-Datei hinzuzufügen.

Um Ihren Code zu testen (zum Beispiel mit Ihrer test_foo.rb), haben Sie mehrere Möglichkeiten:

4) Sie können test_foo.rb mit der Option -I von ruby ​​ausführen, um das Verzeichnis lib / in seinen Ladepfad aufzunehmen:

%Vor%

Dies ist weniger aufdringlich als das Hinzufügen zusätzlicher Includes direkt in Ihrem Code.

5) Bundler ist eine noch bessere Möglichkeit, Ihren Code / Edelstein zu verwalten, um ihn insbesondere unter "echten" Bedingungen zu testen wenn du zwei oder mehr Edelsteine ​​auf einmal entwickelst, die aufeinander angewiesen sind. Bundler bietet Ihnen die Möglichkeit, diese Edelsteine ​​lokal zu referenzieren, sodass Sie sie nicht formell bereitstellen müssen, um ihre Funktionalität während der Entwicklung zu testen. Um Bundler zu verwenden, würden Sie dem Stammverzeichnis Ihres Edelstein-Codes eine Gem-Datei hinzufügen.

6) Schließlich ist es aus praktischen Gründen sinnvoll, gängige Schritte in Ihrem Entwicklungsprozess in ein Rakefile zu integrieren, indem Sie Rake verwenden, um die Prozesse zu steuern.

Ich benutze diese Techniken ziemlich oft in meinen eigenen Projekten, hier sind einige Links für Ihre Referenz, um Ihnen einige konkrete Beispiele zu geben:

1) Testdateien enthalten nur ein "require 'foo'"

2) Verwenden Sie "require_relative" aus Ihrer "main" -Datei, um nachfolgende Teile einzufügen

3) Beispiel für eine gemspec mit request_path auf "lib" gesetzt

5) Beispiel Gemfile

6) Beispiel Rakefile

Natürlich müssen Sie nicht alle diese Techniken anwenden, Sie werden wahrscheinlich mit den Schritten 1-4 gut zurechtkommen, aber wenn Ihr Projekt größer wird, wird sich der zusätzliche Aufwand definitiv auszahlen.

    
emboss 09.06.2012, 13:40
quelle
2

fügen Sie $:.unshift File.expand_path("./lib", __FILE__) in Ihre Testdatei ein, dann können Sie

verwenden %Vor%

ändern Sie "./lib" abhängig von der Struktur Ihres Ordners

    
Yuri Barbashov 09.06.2012 10:03
quelle
1

Ich weiß, dass dies mehrere Jahre zu spät ist, aber da diese Frage in meinen Suchergebnissen viel Beachtung fand, als ich lernte, ein Juwel zu erschaffen, dachte ich, ich würde etwas hinzufügen.

Wenn Sie Ihr Juwel mit dem Bundler-Edelstein-Generator ( bundle gem my_gem_name ) erstellen, wird ein Ruby-ausführbares ./bin/console erzeugt, das irb mit Ihrem geladenen Juwel startet, ohne es tatsächlich zu installieren.

    
Terrabits 13.07.2016 06:52
quelle

Tags und Links