Подтвердить что ты не робот

Программно определить путь жемчужины с помощью связки

Я знаю, что вы можете сделать

bundle show gem_name

чтобы показать путь некоторого драгоценного камня.

Как вы это делаете из кода, используя объект Bundler?

4b9b3361

Ответ 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, я думаю, что это было бы полезно в будущем.