Ruby コマンドライン スイッチ -rubygems と -r には互換性がありませんか?

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

  •  02-07-2019
  •  | 
  •  

質問

最近 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 }'
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top