Sé que puede hacerdeterminar mediante programación utilizando el camino de la gema bundler
bundle show gem_name
para mostrar el camino de alguna joya.
¿Cómo se hace eso desde dentro del código utilizando el objeto Bundler?
Sé que puede hacerdeterminar mediante programación utilizando el camino de la gema bundler
bundle show gem_name
para mostrar el camino de alguna joya.
¿Cómo se hace eso desde dentro del código utilizando el objeto Bundler?
Tener un vistazo a cómo lo hacen en 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
Sí, cli.rb es la mejor manera de mirar. Sin embargo, de todos modos tiene que encontrar el nombre de una especificación.
que le puede dar un punto de partida, pero usted tiene que venir con un poco de solución sobre cómo optimizar a su caso:
GemSearcher = Gem::GemPathSearcher.new Init = GemSearcher.init_gemspecs() GemSearcher.lib_dirs_for(Init[0])
Por desgracia, esta solución proporciona una búsqueda sin nombre, como todas las gemas se encuentran en una matriz en lugar de hash, pero si lo desea, puede hackear GemPathSearcher, creo que sería útil en el futuro.
actualización: empezando por Bündler v1.3.0, hay un público interfaz para la obtención de la trayectoria de una joya:
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, es posible que desee utilizar la solución original compartida (un privada interfaz):
Mejor aún, puede utilizar directamente
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"
Teniendo en cuenta que no es parte de la API (es un método privado), no tendrá ninguna garantía de que va a cambiar, por lo que puede romperse cuando Bundler se actualice. –