Wie sollte ich meinen Ruby Gem-Befehlszeilendienst strukturieren?
-
10-12-2019 - |
Frage
Ich schreibe ein Ruby-Gem, das Benutzer installieren und das Ruby-Befehlszeilentool verwenden können, um mit dem Dienst zu interagieren.Sie können den Dienst starten und stoppen (es wird ein untergeordneter Prozess erzeugt).
Ich habe viel recherchiert, welche Dinge sich am besten zum Schreiben eines Netzwerkdienstes wie ØMQ/EventMachine eignen, und ich weiß, wie man ein Ruby-Gem erstellt, das eine Binärdatei installiert, die Sie in der Befehlszeile verwenden können, aber ich Es fällt mir schwer, eine gute Codestruktur festzulegen.
Mein Befehlszeilenprogramm akzeptiert verschiedene Argumente (ich verwende Schlampe) und es wird verschiedene Klassen verwenden, um Dinge zu tun, und verschiedene andere Rubin-Edelsteine verwenden.
Ich bin mir nicht sicher, wo ich meine Klassendateien ablegen soll und wie ich sie in meiner Binärdatei anfordern soll, damit die Pfade korrekt sind.
Lösung
RubyGems übernimmt dies weitgehend für Sie.Sie müssen Ihre ausführbare Datei in das einfügen files
Liste und fügen Sie es in die ein executables
in Ihrer Gemspec.Es ist üblich, Ihre ausführbare Datei einzufügen bin
in Ihrem Verzeichnis, z.B.:
$ ls
bin/ myapp.gemspec lib/ Rakefile
$ ls bin
bin/myapp
Ihre Gemspec würde dann so aussehen:
Gem::Specification.new do |s|
s.name = 'myapp'
# whatever else is in your gemspec
s.files = ["bin/myapp","lib/myapp.rb"] # or whatever other files you want
s.executables = ["bin/todo"]
end
Wenn Benutzer Ihre App zu diesem Zeitpunkt über RubyGems installieren, myapp
wird ihnen im Weg stehen, und lib
befindet sich im Ladepfad Ihrer App, sodass Ihre ausführbare Datei einfach mit Folgendem beginnen kann:
#!/usr/bin/env ruby
require 'myapp'
# whatever other requires
Das einzige Problem dabei ist, dass man es während der Entwicklung nicht einfach so machen kann bin/myapp
und lassen Sie Ihre App laufen.Einige Entwickler manipulieren den Ladepfad über $:
oder $LOAD_PATH
, aber das gilt als schlechte Form.
Wenn Sie Bundler verwenden, ist es am einfachsten, Ihre App einfach lokal damit auszuführen bundle exec
, z.B. bundle exec bin/myapp
.Alternativ können Sie die verwenden RUBYLIB
Umgebungsvariable, z.B. RUBYLIB=lib bin/myapp
, was setzen wird lib
im Lastpfad.
Andere Tipps
Sie können eine Edelstein-Projektstruktur mit Bundler generieren.
kurz:
Installieren Sie Ihr Juwel generasacodicetagpre.
Führen Sie Ihr Skript aus generasacodicetagpre.
Teilen Sie Ihr Dienstprogramm auf rubygems.org generasacodicetagpre.
mehr docs auf die Website
Da alle Edelsteine von Natur aus Open Source sind, können Sie sich jederzeit einige der besseren als Beispiele ansehen.Verwenden Sie einen Edelstein-Builder wie jeweler
oder hoe
Ich würde Ihnen auch einen Teil der organisatorischen Grundstruktur vermitteln.