Frage

Ich habe kürzlich eine Ruby-Bibliothek in ein Gem konvertiert, was die Benutzerfreundlichkeit der Befehlszeile zu beeinträchtigen schien

Funktionierte gut als Bibliothek

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

Und als Gem weiß irb, wie man ein Gem von Befehlszeilenschaltern anfordert

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

Aber das Gleiche gilt nicht für Ruby selbst:

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

Muss ich jetzt das machen, was hässlich erscheint:

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

Oder gibt es eine Möglichkeit, die beiden Schalter zum Laufen zu bringen?

Notiz:Ich weiß, dass das Gem für jede nützliche Methode eine Bin/ein Programm hinzufügen könnte, aber ich möchte den Befehlszeilen-Namespace nicht unnötig verschmutzen

War es hilfreich?

Lösung

-rubygems ist eigentlich das gleiche wie -r ubygems.

Es ist nicht Chaos mit Ihrem Suchpfad, soweit ich verstehe, aber ich denke, es ist nichts auf Ihre -r Suchpfad entweder hinzufügt. Ich war in der Lage, so etwas zu tun:

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

MyHelpfulClass.rb existiert im Verzeichnis lib oben angegeben.

Diese Art von saugt, aber es zumindest zeigt, dass Sie mehr -r Equire Richtlinien haben können.

Als etwas weniger hässliches Problem umgehen, indem Sie zusätzliche Elemente in den Ruby-Bibliothek-Suchpfad hinzufügen (Kolon in * nichts begrenzt, in den Fenstern begrenzt Semikolon).

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

Wenn Sie nicht mit den Umgebungsvariablen zu verwirren wollen, müssen Sie etwas zu dem Lastpfad hinzufügen können Sie sich:

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

Andere Tipps

Notiz:Dieses Problem besteht für Ruby 1.8, ist jedoch in Ruby 1.9 behoben.

Wenn Sie unter 1.8 beide Bibliotheken über angeben -r, versucht Ruby, jede Bibliothek zu laden, ohne auf Änderungen in der zu achten $LOAD_PATH.Aber Rubygems ändert sich $LOAD_PATH damit die Edelsteine ​​gefunden werden können.

Der Grund, warum es funktioniert irb ist das irb tut beachten $LOAD_PATH Änderungen.

Leider besteht die beste Problemumgehung, die ich gefunden habe, darin, die ausführlichere Form zu verwenden:

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

Der Schmerz nimmt jedoch nicht linear mit der Anzahl der Bibliotheken zu, wenn Sie einen Iterator verwenden:

ruby -rubygems -e '%w(rake rspec).each{|r| require r }'
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top