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

时间:2012-02-17 02:27:00

标签: ruby bundler

我知道你可以做到

bundle show gem_name

显示某些宝石的路径。

如何使用Bundler对象在代码中执行此操作?

4 个答案:

答案 0 :(得分:17)

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

答案 1 :(得分:14)

更新:从Bundler v1.3.0开始,有一个 public 接口,用于获取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"

Pre-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"

答案 2 :(得分:2)

事实证明,您实际上想要使用Gem,而不是Bundler

path = Gem.loaded_specs[NAME_OF_GEM].full_gem_path

答案 3 :(得分:0)

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

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


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

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