Программно определить путь драгоценного камня, используя упаковщик - PullRequest
15 голосов
/ 17 февраля 2012

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

bundle show gem_name

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

Как это сделать из кода с помощью объекта Bundler?

Ответы [ 4 ]

17 голосов
/ 17 февраля 2012

Посмотрите, как они это делают в 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
14 голосов
/ 14 сентября 2012

Обновление : начиная с 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,вы можете использовать исходное общее решение (интерфейс private ):

А еще лучше, вы можете использовать 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"
4 голосов
/ 15 марта 2018

Оказывается, вы действительно хотите использовать Gem для этого, а не Bundler.

path = Gem.loaded_specs[NAME_OF_GEM].full_gem_path

0 голосов
/ 17 февраля 2012

Да, cli.rb - лучший способ посмотреть.Тем не менее, вы все равно должны найти имя спецификации.

Я могу дать вам отправную точку, но вам нужно найти какое-то решение о том, как оптимизировать ваш случай:Это решение обеспечивает безымянный поиск, так как все Gems находятся в массиве вместо хеша, но если вы хотите, вы можете взломать GemPathSearcher, я думаю, что это будет полезно в будущем.

...