So che si può farelivello di programmazione determinare il percorso di gemma usando bundler
bundle show gem_name
per mostrare il percorso di qualche gioiello.
Come si fa dall'interno del codice utilizzando l'oggetto Bundler?
So che si può farelivello di programmazione determinare il percorso di gemma usando bundler
bundle show gem_name
per mostrare il percorso di qualche gioiello.
Come si fa dall'interno del codice utilizzando l'oggetto Bundler?
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
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.
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
0.123.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"
Considerando che non è parte della API (essendo un metodo privato), si avrà alcuna garanzia che cambierà, quindi potrebbe rompersi quando Bundler viene aggiornato. –