Come dovrei strutturare il mio servizio di riga di comando Gem rubino?
-
10-12-2019 - |
Domanda
Sto scrivendo un gemma rubino che gli utenti possono installare e utilizzare lo strumento Ruby della riga di comando per interagire con il servizio.Puoi iniziare e fermare il servizio (generarà un processo figlio).
Ho fatto molte ricerche sulle cose migliori da utilizzare per scrivere un servizio di rete, come Ømq / eventmachine e ottengo come creare un gemma rubino che installerà un binario che è possibile utilizzare nella riga di comando,Ma sto lottando per stabilire una buona struttura del codice.
La mia utilità della riga di comando prenderà vari argomenti (utilizzerò trollop ) e lo userà variClassi per fare le cose e usa varie altre gemme rubino.
Non sono sicuro di dove dovrei mettere i miei file di classe e come richiederli nel mio binario in modo che i percorsi siano corretti.
Soluzione
In gran parte, Rubygems si prenderà cura di questo per te. Dovrai includere il tuo eseguibile nell'elenco files
e inserirlo nel executables
nel tuo GEMSpec. È comune mettere il tuo eseguibile in bin
nella tua directory, ad esempio.:
$ ls
bin/ myapp.gemspec lib/ Rakefile
$ ls bin
bin/myapp
.
Il tuo Gemspec sarà quindi come:
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
.
A questo punto, quando gli utenti installano la tua app tramite Rubygemms, myapp
sarà nel loro percorso, e lib
sarà nel caricamento del tuo app, quindi il tuo eseguibile può semplicemente iniziare con:
#!/usr/bin/env ruby
require 'myapp'
# whatever other requires
.
L'unico problema con questo è quello, durante lo sviluppo, non puoi semplicemente fare bin/myapp
e far funzionare la tua app. Alcuni Devs manipolano il percorso di carico tramite $:
o $LOAD_PATH
, ma questa è considerata una cattiva forma.
Se stai usando Bundler, è più facile semplicemente eseguire la tua app localmente con bundle exec
, ad es. bundle exec bin/myapp
. È possibile utilizzare alternativamente la variabile di ambiente RUBYLIB
, ad es. RUBYLIB=lib bin/myapp
, che metterà lib
nel percorso di carico.
Altri suggerimenti
È possibile generare una struttura del progetto GEM con Bundler .
brevemente:
Installa Bundler
.
$ gem install bundler
Usa Bundler per generare il progetto GEM
.
$ bundle gem myapp
$ cd myapp
Aggiungi un eseguibile
.
$ mkdir bin
$ cat > bin/mycommand << EOSCRIPT
#!/usr/bin/env ruby
require 'myapp'
puts "Executing myapp"
EOSCRIPT
$ chmod +x bin/mycommand
Installa il tuo gemma
.
$ rake install
Esegui il tuo script
.
$ mycommand
Executing mycommand
Condividi la tua utilità su rubygems.org
.
$ rake release
Più documenti su Il sito Web
Poiché tutte le gemme sono open source per natura, potresti sempre dare un'occhiata ad alcuni dei migliori per gli esempi.L'utilizzo di un Gem Builder come jeweler
o hoe
ti avrebbe anche impostato con parte della struttura di base organizzativamente.