2012-03-26 9 views
4

gemspecでは、実行時に必要としたいパスを表すrequire_pathsを指定できます。これらはRubyGemsによって$LOAD_PATHに入れられます。コマンドラインアプリケーションを動作させるためにRubyGemsがロードパスに追加したパスを特定できますか?

私の質問です:実行時にこれらのパスが何であるかを判断する方法はありますか? $LOAD_PATHの要素を調べて、私の宝石のためだけに追加されたものを知ることはできますか?

更新:最終的に、私は宝石の内部からルビファイルを動的にロードしたいと思います。

load_from 'foo/bar' 

さらに、$MY_GEMS_LIB_DIR/foo/bar/*.rbが見つかりました。私は確かに$LOAD_PATHを探してfoo/barを探していますが、私はむしろそれを宝石に限定したいと思っています。

+1

あなたは解決しようとしている問題を説明できますか? –

+0

は更なる情報で質問を更新しました – davetron5000

+0

絶対パスを得るために 'File.expand_path( '../ bar'、__FILE __)'のようなものを使ってみませんか? (あなたが正しく理解していれば、自分のファイルをロードしたい) –

答えて

0

$:はirbでグローバルに使用できます。 gem whichコマンドもあります。これはライブラリのパスを提供しますが、正確に必要なものが含まれているかどうかはわかりません。

+0

これはロード・パスにアクセスする方法です。私はそれを行う方法を知っています。私はロードパスのどの部分が私のアプリケーションに固有のRubyGemsによって変更されたかを見たいと思っています – davetron5000

0

Gem.find_filesのように見えます。

+0

これはそれほどのことではありません。それはインストールされた宝石の中で検索するようです。おそらく私が望むものは不可能です。自分のコードが現在実行されている宝石によって追加されたロードパスを傍受できることを願っていました。 – davetron5000

+0

@ davetron5000 BTW gemのロードパスはBundlerによって '$ LOAD_PATH'に追加できます。その場合、Rubygemsのアクティベーションメカニズムはまったく使用されません。 –

+0

これはRubyGems経由でインストールされたコマンドラインアプリの場合に起こりますか? – davetron5000

1

あなたの必要を理解しているかどうかわかりません(私の英語は悪いです: - /);問題は、あなたがGem::Specification.lib_dirs_globを使用することができます宝石を必要とするときにロードされるディレクトリを決定することであるならば、とにかく、:

Gem::Specification.find_by_name('irbtools').lib_dirs_glob 
#=> "/home/my_user/.rvm/gems/ruby-1.9.3-p125/gems/irbtools-1.2.2/lib" 

Gem::Specification.find_by_name('xyz').lib_dirs_glob 
# raises a Gem::LoadError 

のでload_fromの可能な実装は次のようになります。ロードしようと

def load_from(gem_name, path) 
    path_to_load = File.join(Gem::Specification.find_by_name(gem_name).lib_dirs_glob, path) 
    Dir.glob(path_to_load).each(&method(:load)) 
end 

Thor::CoreExt

Thor::CoreExt #=> NameError: uninitialized constant Thor 
load_from 'thor', 'thor/core_ext/*.rb' 
Thor::CoreExt #=> Thor::CoreExt 

これはルビー1.9.3と1.8.21宝石と私のマシン上で動作します。

1

私が正しくあなたを理解していれば、これは(ルビー1.9.3)を実行する必要があります。もちろん

before = $LOAD_PATH.dup 
require 'the_gem' 
added_paths = $LOAD_PATH - before 

、これは依存関係によって追加のパスが含まれます。

関連する問題