Ruby コマンドライン スイッチ -rubygems と -r には互換性がありませんか?
質問
最近 Ruby ライブラリを gem に変換しましたが、コマンドラインの使いやすさが損なわれているようでした
図書館としては問題なく使えました
$ ruby -r foobar -e 'p FooBar.question' # => "answer"
そして、irb は gem として、コマンドライン スイッチから gem を要求する方法を知っています。
$ irb -rubygems -r foobar
irb(main):001:0> FooBar.question # => "answer"
しかし、Ruby 自体では同じことが起こりません。
$ ruby -rubygems -r foobar -e 'p FooBar.question'
ruby: no such file to load -- foobar (LoadError)
私は今これをしなければなりません、それは醜いように思えます:
ruby -rubygems -e 'require "foobar"; p FooBar.question' # => "answer"
それとも2つのスイッチを動作させる方法はありますか?
注記:gem が便利なメソッドごとに bin/プログラムを追加できることは知っていますが、コマンド ラインの名前空間を不必要に汚染するのは好きではありません。
解決
-rubygems は実際には -r ubygems と同じです。
私が理解している限り、これは検索パスを台無しにすることはありませんが、-r 検索パスにも何も追加されないと思います。次のようなことができました。
ruby -rubygems -r /usr/lib/ruby/gems/myhelpfulclass-0.0.1/lib/MyHelpfulClass -e "puts MyHelpfulClass"
MyHelpfulClass.rb は、上で指定した lib ディレクトリに存在します。
これはひどいことですが、少なくとも、複数の -r equire ディレクティブを使用できることを示しています。
もう少し醜い回避策として、Ruby ライブラリの検索パス (*nix ではコロン区切り、Windows ではセミコロン区切り) に項目を追加できます。
export RUBYLIB=/usr/lib/ruby/gems/1.8/gems/myhelpfulclass-0.0.1/lib
ruby -rubygems -r MyHelpfulClass -e "puts MyHelpfulClass"
環境変数をいじりたくない場合は、ロード パスに自分で何かを追加できます。
ruby -I /usr/lib/ruby/gems/1.8/gems/myhelpfulclass-0.0.1/lib \
-rubygems -r MyHelpfulClass -e "puts MyHelpfulClass"
他のヒント
注記:この問題は Ruby 1.8 にも存在しますが、Ruby 1.9 では解決されています。
1.8 では、両方のライブラリを次のように指定すると、 -r
, Ruby は、ファイル内の変更に注意を払わずに各ライブラリをロードしようとします。 $LOAD_PATH
. 。しかし、rubygems は変わります $LOAD_PATH
宝石が見つかるように。
効果がある理由 irb
それは? irb
する 注意を払う $LOAD_PATH
変化します。
残念ながら、私が見つけた最善の回避策は、より冗長な形式を使用することです。
ruby -rubygems -e 'require "foobar"; p FooBar.question'
ただし、イテレータを使用する場合、問題はライブラリの数に応じて直線的に増加しません。
ruby -rubygems -e '%w(rake rspec).each{|r| require r }'