Les commutateurs de ligne de commande ruby ??sont -rubygems & amp; -r incompatible?

StackOverflow https://stackoverflow.com/questions/124035

  •  02-07-2019
  •  | 
  •  

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

Était-ce utile?

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 }'
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top