如何找到安装Ruby Gem的路径(即Gem.lib_path c.f. Gem.bin_path)

时间:2011-03-07 23:42:11

标签: ruby api rubygems

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建议。

4 个答案:

答案 0 :(得分:75)

检查答案的问题是你必须“要求”rubygem或它不起作用。通常这是不可取的,因为如果你正在使用可执行的gem,你不想“需要”它,否则你会得到一堆警告。

这是可执行文件和库的通用解决方案:

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

如果你想获得真正的技术,那么不只有一个lib目录。 gemspec有一个要搜索的所有directorys的“require_paths”数组(添加到$ LOAD_PATH)。所以,如果你想要一个require_paths数组,请使用:

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

不需要捆绑包。

答案 1 :(得分:23)

在使用require加载gem之后,使用Gem.loaded_specs找到lib路径,如下所示:

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

答案 2 :(得分:15)

我不确定你为什么要这样做,但是如果你在命令行上,请使用gem env

答案 3 :(得分:4)

尝试使用bundle show cucumber

其中,从查看bundler的来源做了类似的事情:

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

使用bundler,对吗?