我知道你可以做到
bundle show gem_name
显示某些宝石的路径。
如何使用Bundler对象在代码中执行此操作?
答案 0 :(得分:17)
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,我认为这将来会有用。