我可以确定RubyGems添加到加载路径中的哪些路径使我的命令行应用程序工作吗



在gemspec中,我可以指定require_paths,它表示我希望在运行时能够要求的路径。这些由RubyGems放入$LOAD_PATH

我的问题是:有没有一种方法可以在运行时确定这些路径?我可以检查$LOAD_PATH的元素并知道哪些元素是为我的宝石添加的吗?

更新:最终,我想从gem内部动态加载ruby文件,例如

load_from 'foo/bar'

并找到$MY_GEMS_LIB_DIR/foo/bar/*.rb。我当然可以遍历整个$LOAD_PATH来查找foo/bar,但我宁愿将其仅限于gem。

我不知道我是否理解你的需要(我的英语不好:-/);无论如何,如果问题是确定当您需要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机器。

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

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

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

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

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

最新更新