Les commutateurs de ligne de commande ruby ??sont -rubygems & amp; -r incompatible?
Question
J'ai récemment converti une bibliothèque ruby ??en une gemme, ce qui semblait compromettre la convivialité de la ligne de commande
Fonctionne bien comme une bibliothèque
$ ruby -r foobar -e 'p FooBar.question' # => "answer"
Et en tant que gemme, irb sait comment demander une gemme aux commutateurs de ligne de commande
$ irb -rubygems -r foobar
irb(main):001:0> FooBar.question # => "answer"
Mais le même échec pour ruby ??lui-même:
$ ruby -rubygems -r foobar -e 'p FooBar.question'
ruby: no such file to load -- foobar (LoadError)
dois-je faire cela maintenant, ce qui semble moche:
ruby -rubygems -e 'require "foobar"; p FooBar.question' # => "answer"
Ou existe-t-il un moyen de faire fonctionner les 2 commutateurs?
Note : Je sais que la gemme pourrait ajouter un bin / programme pour chaque méthode utile, mais je n'aime pas polluer inutilement l'espace de nom de la ligne de commande
La solution
-rubygems est en fait le même que -r ubygems.
Pour autant que je sache, votre chemin de recherche n’est pas gâché, mais je pense que cela n’ajoute rien à votre chemin de recherche -r. J'ai été capable de faire quelque chose comme ça:
ruby -rubygems -r /usr/lib/ruby/gems/myhelpfulclass-0.0.1/lib/MyHelpfulClass -e "puts MyHelpfulClass"
MyHelpfulClass.rb existe dans le répertoire lib spécifié ci-dessus.
Ce genre de merde, mais cela démontre au moins que vous pouvez avoir plusieurs directives -r equire.
Comme solution de contournement un peu moins laide, vous pouvez ajouter des éléments supplémentaires au chemin de recherche de la bibliothèque ruby ??(délimités par des points dans * nix, délimités par des points-virgules dans des fenêtres).
export RUBYLIB=/usr/lib/ruby/gems/1.8/gems/myhelpfulclass-0.0.1/lib
ruby -rubygems -r MyHelpfulClass -e "puts MyHelpfulClass"
Si vous ne voulez pas manipuler la variable d'environnement, vous pouvez ajouter quelque chose au chemin de chargement:
ruby -I /usr/lib/ruby/gems/1.8/gems/myhelpfulclass-0.0.1/lib \
-rubygems -r MyHelpfulClass -e "puts MyHelpfulClass"
Autres conseils
Remarque: ce problème existe pour ruby ??1.8, mais il est résolu dans ruby ??1.9.
Sur la 1.8, si vous spécifiez les deux bibliothèques via -r
, ruby ??essaiera de charger chaque bibliothèque sans prêter attention aux modifications apportées à $ LOAD_PATH
. Mais rubygems change $ LOAD_PATH
pour que les gemmes puissent être trouvées.
La raison pour laquelle cela fonctionne avec irb
est que irb
tient attentif aux $ LOAD_PATH
.
Malheureusement, la meilleure solution que j'ai trouvée consiste à utiliser la forme la plus verbeuse:
ruby -rubygems -e 'require "foobar"; p FooBar.question'
Cependant, si vous utilisez un itérateur, la douleur n'augmente pas de manière linéaire avec le nombre de bibliothèques:
ruby -rubygems -e '%w(rake rspec).each{|r| require r }'