2012-02-17 11 views

Respuesta

15

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 
0

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.

13

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" 
+1

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. –

Cuestiones relacionadas