2012-02-17 11 views

risposta

15

Avere uno sguardo a come lo fanno in 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

Yup, cli.rb è il modo migliore per guardare. Comunque devi comunque trovare il nome di una specifica.

posso darvi un punto di partenza, ma devi venire con qualche soluzione su come ottimizzare al vostro caso:

 

    GemSearcher = Gem::GemPathSearcher.new 
    Init = GemSearcher.init_gemspecs() 
    GemSearcher.lib_dirs_for(Init[0]) 

Purtroppo questa soluzione offre funzionalità di ricerca senza nome come tutte le gemme sono in un array invece di hash, ma se vuoi puoi hackerare GemPathSearcher, penso che sarebbe utile in futuro.

13

Aggiornamento: a cominciare Bundler v1.3.0, c'è un pubblico un'interfaccia per ottenere il percorso di un gioiello:

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, si può decidere di utilizzare la soluzione originale condivisa (un privato interfaccia):

Meglio ancora, è possibile utilizzare direttamente Bundler::CLI#locate_gem:

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

Considerando che non è parte della API (essendo un metodo privato), si avrà alcuna garanzia che cambierà, quindi potrebbe rompersi quando Bundler viene aggiornato. –

Problemi correlati