2011-03-07 89 views
43
Gem.bin_path('cucumber', 'cucumber') 

将返回二进制/可执行文件的路径。 似乎没有这样的函数来返回库路径。 在这种情况下将,理想情况下,返回:如何找到安装Ruby Gem的路径(即Gem.lib_path c.f. Gem.bin_path)

/home/hedge/.rvm/gems/[email protected]/gems/cucumber-0.10.0/lib 

有我错过了一些东西或者是有一个简单的/一个方法方式来获得这些信息?

更新:请不要使用CLI或非stdlib建议。

回答

73

与核对答案的问题是,你必须“规定”的rubygem或它赢得没有工作。通常这是不可取的,因为如果你使用可执行的gem,你不想“要求”它,否则你会得到一堆警告。

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

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

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

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

不需要捆绑器。

4

尝试使用bundle show cucumber

其中,从没有像在打捆来源看:使用

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

打捆,对不对?

+0

大不了Bundler,我已经对它进行了广泛的修补,所以当你开始在旅游代码中使用它时,会发生什么。尽管如此,单独列出的git问题使其脱离极限 - 但有趣的是保持眼睛:) – Hedgehog 2011-03-09 11:15:27

15

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

+0

对不起,应该已经明确 - 没有cli,只是api。 – Hedgehog 2011-03-09 11:16:01

+0

感谢您的简单,正是我所期待的。 – 2014-02-11 03:03:52

22

创业板已经载入要求后,你会发现使用Gem.loaded_specs的lib路径,如下所示:

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

这对于rubygems 1.3.6来说非常适用,例如(作为标准在mac上发布的版本),而Gem :: Specification.find_by_name(“cucumber”) 则不会。干杯盖伊,救了我一堆麻烦! – 2012-06-20 10:30:44