Программно определить путь жемчужины с помощью связки
Я знаю, что вы можете сделать
bundle show gem_name
чтобы показать путь некоторого драгоценного камня.
Как вы это делаете из кода, используя объект Bundler?
Ответы
Ответ 1
Посмотрите, как они это делают в 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
Ответ 2
Обновить: начиная с 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"
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"
Ответ 3
Yup, cli.rb - лучший способ посмотреть. Однако вам все равно нужно найти имя спецификации.
Я могу дать вам отправную точку, но вы должны прийти с некоторым решением о том, как оптимизировать ваш случай:
GemSearcher = Gem::GemPathSearcher.new
Init = GemSearcher.init_gemspecs()
GemSearcher.lib_dirs_for(Init[0])
К сожалению, это решение обеспечивает безымянный поиск, поскольку все драгоценные камни находятся в массиве вместо хэша, но если вы хотите, чтобы вы могли взломать GemPathSearcher, я думаю, что это было бы полезно в будущем.