web-dev-qa-db-ja.com

パスを見つける方法a Ruby Gemは次の場所にインストールされています(つまりGem.lib_path c.f. Gem.bin_path)

Gem.bin_path('cucumber', 'cucumber')

バイナリ/実行可能ファイルのパスを返します。ライブラリパスを返すような関数はないようです。この場合、理想的には以下を返します:

/home/hedge/.rvm/gems/Ruby-1.9.2-p136@bbb-bdd-meta-bdd/gems/cucumber-0.10.0/lib

私は何かを見逃したことがありますか、この情報を取得する簡単な方法がありますか?

更新:CLIまたはstdlib以外の提案はありません。

44
Hedgehog

チェックされた答えの問題は、rubygemを「要求」しなければならないことです。そうしないと動作しません。多くの場合、これは望ましくありません。実行可能なgemを使用している場合、「必要」にしたくない場合、または大量の警告が表示されるためです。

これは、実行可能ファイルとライブラリのユニバーサルソリューションです。

spec = Gem::Specification.find_by_name("cucumber")
gem_root = spec.gem_dir
gem_lib = gem_root + "/lib"

本当に技術的になりたいのであれば、libディレクトリは1つではありません。 gemspecには、検索するすべてのディレクトリの「require_paths」配列があります($ LOAD_PATHに追加されます)。したがって、require_pathsの配列が必要な場合は、これを使用します。

gem_lib = gem_root + "/" + spec.require_paths[0]

バンドラーは必要ありません。

76
user1182000

Gemがrequireでロードされた後、次のようにGem.loaded_specsを使用してlibパスを見つけます。

require 'rubygems'
require 'cucumber'
gem_root = Gem.loaded_specs['cucumber'].full_gem_path
gem_lib = File.join(gem_root, 'lib')
23
Guy

なぜこれを行うのかわかりませんが、コマンドラインを使用している場合は、gem env

15
Andrew Grimm

bundle show cucumberを使用してみてください。

バンドラーのソースを見ると、次のようになります:

spec = Bundler.load.specs.find{|s| s.name == name }
spec.full_gem_path

are bundlerを使用していますか?

4
jonnii