使用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,我想这将来会很有用。