使用bundler以编程方式确定gem的路径

我知道你能做到

bundle show gem_name 

展示一些gem的路径。

你如何使用Bundler对象从代码中做到这一点?

看看他们是如何在cli.rb中做到的

 def locate_gem(name) spec = Bundler.load.specs.find{|s| s.name == name } raise GemNotFound, "Could not find gem '#{name}' in the current bundle." unless spec if spec.name == 'bundler' return File.expand_path('../../../', __FILE__) end spec.full_gem_path end 

更新 :从Bundler v1.3.0开始,有一个用于获取Gem路径的公共接口:

 Bundler.rubygems.find_name('json').first.full_gem_path # => "/opt/src/foo/my_app/vendor/bundle/ruby/2.0.0/gems/json-1.8.0" 

在v1.3.0之前,您可能希望使用原始解决方案共享( 私有接口):

更好的是,您可以直接使用Bundler::CLI#locate_gem

 require "bundler/cli" Bundler::CLI.new.send(:locate_gem, "json") # => "/opt/src/foo/my_app/vendor/bundle/ruby/1.9.1/gems/json-1.7.3" 

事实certificate你实际上想要使用Gem ,而不是Bundler

path = Gem.loaded_specs[NAME_OF_GEM].full_gem_path

是的,cli.rb是最好的观察方式。 但无论如何你必须找到一个规格的名称。

我可以给你一个起点,但你必须找到一些解决方案来优化你的案例:


     GemSearcher = Gem :: GemPathSearcher.new
     Init = GemSearcher.init_gemspecs()
     GemSearcher.lib_dirs_for(初始化[0])

不幸的是,这个解决方案提供了无名搜索,因为所有Gems都在一个数组而不是哈希,但是如果你想要你可以破解GemPathSearcher,我想这将来会很有用。