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

如果我理解正确,应该这样做(Ruby 1.9.3):

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

当然,这将包括依赖项添加的路径。

于 2012-04-12T16:02:38.713 回答
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 回答
0

看起来Gem.find_files可能会对您有所帮助。

于 2012-04-09T20:28:01.573 回答
0

您可以$:在 irb 中使用全局。还有一个gem which命令可以为您提供库路径,但我不确定这是否包含您想要的内容。

于 2012-03-26T00:04:05.310 回答