2008-09-23 19 views
6

Recientemente he convertido una biblioteca de rubí a una joya, que pareció romper la utilidad de línea de comandos¿Los modificadores de línea de comando ruby ​​-rubygems & -r son incompatibles?

funcionó bien como una biblioteca

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

Y como una joya, IRB sabe requiere una joya de comandos -line interruptores

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

Pero la misma falla de rubí en sí:

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

debo ahora hacer esto, que parece fea:

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

O hay una manera de hacer el trabajo 2 interruptores?

Nota: Sé que el tesoro podría añadir un bin/programa para cada método útil, pero no me gusta a contaminar el espacio de nombres de línea de comandos innecesariamente

Respuesta

7

-rubygems es en realidad el mismo que -r ubygems.

Por lo que yo sé, no ensucia con su ruta de búsqueda, pero creo que tampoco agrega nada a su ruta de búsqueda. Yo era capaz de hacer algo como esto: existe

ruby -rubygems -r /usr/lib/ruby/gems/myhelpfulclass-0.0.1/lib/MyHelpfulClass -e "puts MyHelpfulClass" 

MyHelpfulClass.rb en el directorio lib especificado anteriormente.

Eso es una mierda, pero al menos demuestra que puede tener múltiples directivas equire.

Como una solución menos fea, puede agregar elementos adicionales a la ruta de búsqueda de la biblioteca de ruby ​​(delimitada por dos puntos en * nix, punto y coma delimitados en ventanas).

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

Si usted no quiere meterse con la variable de entorno, se puede añadir algo a la vía de carga a sí mismo:

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

Tienes razón (observa "ubygems.rb" en ruby ​​/ site_ruby/1.8), pero ¿por qué falla con las 2? ¿Cambia la ruta de carga o algo así? –

+0

¿Se requiere el cambio de gemas de rubor aquí? ¿Puedo especificar -r MyHelpfulClass sin el modificador -rubygems? – Donato

0

Nota: este problema existe para Ruby 1.8, pero se resuelve en ruby 1.9.

En 1.8, si especifica ambas librerías a través de -r, ruby ​​intentará cargar cada biblioteca sin prestar atención a los cambios en el $LOAD_PATH. Pero rubygems cambia $LOAD_PATH por lo que las gemas se pueden encontrar.

La razón funciona con irb es que irb hace prestar atención a $LOAD_PATH cambios.

Por desgracia, la mejor solución que he encontrado es el uso de la forma más detallada:

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

El dolor no aumenta linealmente con el número de bibliotecas, sin embargo, si se utiliza un iterador:

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