Sono interruttori di riga di comando ruby ​​-rubygems & -r incompatibile?


6

Recentemente ho convertito una biblioteca rubino ad una gemma, che sembrava rompere l'usabilità riga di comando

ha funzionato bene come una libreria

$ ruby -r foobar -e 'p FooBar.question' # => "answer" 

E come una gemma, IRB sa come richiedere una gemma da Command -line interruttori

$ irb -rubygems -r foobar 
    irb(main):001:0> FooBar.question # => "answer" 

Ma la stessa fallisce rubino in sé:

$ ruby -rubygems -r foobar -e 'p FooBar.question' 
    ruby: no such file to load -- foobar (LoadError) 

devo ora fare questo, che sembra brutto:

ruby -rubygems -e 'require "foobar"; p FooBar.question' # => "answer" 

O c'è un modo per rendere il lavoro di 2 interruttori?

Nota: So che il gioiello potrebbe aggiungere un bidone/programma per ogni metodo utile, ma non mi piace di inquinare lo spazio dei nomi da riga di comando inutilmente

7

-rubygems è in realtà lo stesso di -r ubygems.

Non rovina il tuo percorso di ricerca, per quanto ho capito, ma penso che non aggiunga nulla al tuo percorso di ricerca -r neanche. 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 presente nella directory lib sopra specificato.

Questo tipo di problemi, ma almeno dimostra che è possibile avere più direttive equo-equ.

Come soluzione leggermente meno brutta, è possibile aggiungere ulteriori elementi al percorso di ricerca della libreria ruby ​​(due punti delimitati in * nix, punto e virgola delimitati in Windows).

export RUBYLIB=/usr/lib/ruby/gems/1.8/gems/myhelpfulclass-0.0.1/lib 
ruby -rubygems -r MyHelpfulClass -e "puts MyHelpfulClass" 

Se non si vuole fare confusione con la variabile d'ambiente, è possibile aggiungere qualcosa al percorso di carico da soli:

ruby -I /usr/lib/ruby/gems/1.8/gems/myhelpfulclass-0.0.1/lib \ 
    -rubygems -r MyHelpfulClass -e "puts MyHelpfulClass" 
  0

Hai ragione (osserva 'ubygems.rb' in ruby ​​/ site_ruby/1.8), ma allora perché non riesce con il 2 richiede? Cambia il percorso di caricamento o qualcosa del genere? 23 set. 082008-09-23 21:44:43

  0

L'interruttore -rubygems è richiesto qui? Posso specificare -r MyHelpfulClass senza l'opzione -rubygems? 07 giu. 162016-06-07 01:11:24


0

Nota: questo problema esiste per Ruby 1.8, ma si risolve in rubino 1.9.

Su 1.8, se si specificano entrambe le librerie tramite -r, ruby ​​tenterà di caricare ciascuna libreria senza prestare attenzione alle modifiche apportate allo $LOAD_PATH. Ma i rubygems cambiano $LOAD_PATH in modo che le gemme possano essere trovate.

Il motivo per cui funziona con irb è che irbfa prestare attenzione a $LOAD_PATH cambiamenti.

Purtroppo, la soluzione migliore che ho trovato è quello di utilizzare il modulo più dettagliato:

ruby -rubygems -e 'require "foobar"; p FooBar.question' 

Il dolore non aumenta linearmente con il numero di librerie, però, se si utilizza un iteratore:

ruby -rubygems -e '%w(rake rspec).each{|r| require r }'