Sind die Ruby-Befehlszeilenschalter -rubygems und -r inkompatibel?
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
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 }'