Son rubí modificadores de línea de comandos -rubygems & -r incompatibles?
Pregunta
Recientemente he convertido un rubí de la biblioteca a una joya, que parecía romper la línea de comandos de usabilidad
Funcionaba como una biblioteca
$ ruby -r foobar -e 'p FooBar.question' # => "answer"
Y como una joya, el irb sabe cómo solicitar una gema de modificadores de línea de comandos
$ irb -rubygems -r foobar
irb(main):001:0> FooBar.question # => "answer"
Pero la misma falla por ruby sí mismo:
$ ruby -rubygems -r foobar -e 'p FooBar.question'
ruby: no such file to load -- foobar (LoadError)
debo ahora hacer esto, que parece feo:
ruby -rubygems -e 'require "foobar"; p FooBar.question' # => "answer"
O hay una manera de hacer que los 2 interruptores de trabajo?
Nota:Sé que la joya podría añadir un bin/programa para cada método útil, pero no me gusta contaminar la línea de comandos de espacio de nombres innecesariamente
Solución
-rubygems es de hecho la misma -r ubygems.
No se metan con su ruta de búsqueda, tal y como yo lo entiendo, pero creo que no aporta nada a su -r ruta de búsqueda de cualquiera.Yo era capaz de hacer algo como esto:
ruby -rubygems -r /usr/lib/ruby/gems/myhelpfulclass-0.0.1/lib/MyHelpfulClass -e "puts MyHelpfulClass"
MyHelpfulClass.rb existe en el directorio lib de lo especificado anteriormente.
Que tipo de mierda, pero al menos demuestra que puede tener múltiples -r equire directivas.
Como un poco menos feo solución, puede agregar elementos adicionales para el rubí ruta de búsqueda de biblioteca (delimitada por dos puntos en *nix, delimitado por punto y coma en windows).
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 trayectoria de la carga a sí mismo:
ruby -I /usr/lib/ruby/gems/1.8/gems/myhelpfulclass-0.0.1/lib \
-rubygems -r MyHelpfulClass -e "puts MyHelpfulClass"
Otros consejos
Nota:este problema existe para ruby 1.8, pero se resuelve en ruby 1.9.
En la 1.8, si especifica libs a través de -r
, ruby intentará cargar cada biblioteca sin prestar atención a los cambios en la $LOAD_PATH
.Pero rubygems hace el cambio $LOAD_PATH
así que las gemas se pueden encontrar.
La razón por la que funciona con irb
es que irb
¿ preste atención a $LOAD_PATH
cambios.
Por desgracia, la mejor solución que he encontrado es utilizar la más detallado de la forma:
ruby -rubygems -e 'require "foobar"; p FooBar.question'
El dolor no aumenta linealmente con el número de librerías, sin embargo, si usted usa un iterador:
ruby -rubygems -e '%w(rake rspec).each{|r| require r }'