Sono ruby ??switch della riga di comando -rubygems & amp; -r incompatibile?
Domanda
Di recente ho convertito una libreria di rubini in una gemma, che sembrava infrangere l'usabilità della riga di comando
Ha funzionato bene come libreria
$ ruby -r foobar -e 'p FooBar.question' # => "answer"
E come gemma, irb sa come richiedere una gemma dalle opzioni della riga di comando
$ irb -rubygems -r foobar
irb(main):001:0> FooBar.question # => "answer"
Ma lo stesso fallisce per il rubino stesso:
$ ruby -rubygems -r foobar -e 'p FooBar.question'
ruby: no such file to load -- foobar (LoadError)
ora devo farlo, il che sembra brutto:
ruby -rubygems -e 'require "foobar"; p FooBar.question' # => "answer"
O c'è un modo per far funzionare i 2 switch?
Nota : so che la gemma potrebbe aggiungere un bin / programma per ogni metodo utile, ma non mi piace inquinare inutilmente lo spazio dei nomi della riga di comando
Soluzione
-rubygems è in realtà lo stesso di -r ubygems.
Non scherza con il tuo percorso di ricerca, per quanto ne so, ma penso che non aggiunga nulla al tuo percorso di ricerca -r. Sono stato in grado di fare qualcosa del genere:
ruby -rubygems -r /usr/lib/ruby/gems/myhelpfulclass-0.0.1/lib/MyHelpfulClass -e "puts MyHelpfulClass"
MyHelpfulClass.rb esiste nella directory lib sopra specificata.
Questo tipo di schifo, ma almeno dimostra che puoi avere più direttive -r equire.
Come soluzione leggermente meno brutta, puoi aggiungere ulteriori elementi al percorso di ricerca della libreria ruby ??(due punti delimitati da * nix, punti e virgola delimitati da Windows).
export RUBYLIB=/usr/lib/ruby/gems/1.8/gems/myhelpfulclass-0.0.1/lib
ruby -rubygems -r MyHelpfulClass -e "puts MyHelpfulClass"
Se non vuoi fare confusione con la variabile d'ambiente, puoi aggiungere qualcosa al percorso di caricamento:
ruby -I /usr/lib/ruby/gems/1.8/gems/myhelpfulclass-0.0.1/lib \
-rubygems -r MyHelpfulClass -e "puts MyHelpfulClass"
Altri suggerimenti
Nota: questo problema esiste per ruby ??1.8, ma è stato risolto in ruby ??1.9.
Su 1.8, se specifichi entrambe le librerie tramite -r
, ruby ??proverà a caricare ciascuna libreria senza prestare attenzione alle modifiche in $ LOAD_PATH
. Ma rubygems cambia $ LOAD_PATH
in modo da poter trovare le gemme.
Il motivo per cui funziona con irb
è che irb
non presta attenzione alle modifiche di $ LOAD_PATH
.
Sfortunatamente, la migliore soluzione che ho trovato è usare la forma più dettagliata:
ruby -rubygems -e 'require "foobar"; p FooBar.question'
Il dolore non aumenta linearmente con il numero di librerie, se usi un iteratore:
ruby -rubygems -e '%w(rake rspec).each{|r| require r }'