4

gemspecで、を指定できますrequire_paths。これは、実行時に要求できるようにするパスを表します。$LOAD_PATHこれらはRubyGemsによって入れられます。

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

更新:最終的には、gem内からrubyファイルを動的にロードしたいと思います。

load_from 'foo/bar'

そして、それを見つけてもらいます$MY_GEMS_LIB_DIR/foo/bar/*.rb$LOAD_PATH私は確かに探している全体を調べることができますfoo/barが、私はむしろそれを宝石だけに限定したいと思います。

4

4 に答える 4

1

私はあなたの必要性を理解したかどうかわかりません (私の英語は下手です :-/ ); とにかく、gem が必要なときにロードされるディレクトリを決定することが問題である場合は、次を使用できます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

これは私のマシンで ruby​​ 1.9.3 と gem 1.8.21 で動作します。

于 2012-04-11T19:15:31.530 に答える
1

私があなたを正しく理解していれば、これでうまくいくはずです(Ruby 1.9.3):

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

もちろん、これには依存関係によって追加されたパスが含まれます。

于 2012-04-12T16:02:38.713 に答える
0

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

于 2012-03-26T00:04:05.310 に答える
0

Gem.find_filesが役立つようです。

于 2012-04-09T20:28:01.573 に答える