2014-12-16 12 views
6

In fase di runtime, dopo aver completato la configurazione di bundler e applicato groups, qual è il modo migliore per verificare a livello di programmazione se un dato gem_name è nel pacchetto?Controlla a livello di programmazione se gem in bundle?

Leggendo la fonte, ho scoperto Bundler.definition, ad es.

gem_name = 'banana' 
Bundler.definition.dependencies.map(&:name).include?(gem_name) 

ma incapace di trovare la documentazione , non so se questo è l'utilizzo consigliato.

Aggiornamento: Sembra che Bundler::Definition#dependencies restituisca tutte le dipendenze, indipendentemente dai gruppi. In alternativa, ho scoperto Bundler::Runtime#dependencies_for che accetta gruppi come argomenti.

Bundler.load.dependencies_for(:default, Rails.env).map(&:name).include?(gem_name) 

Tuttavia, sembra una cattiva idea duplicare le "liste di gruppi" in ogni sito di chiamata. Idealmente, mi piacerebbe un metodo in che non mi imponga di specificare i gruppi attuali.

1 Il sito Web di bundler e la pagina man sono incentrati sull'utilizzo della riga di comando. Non ho trovato alcuna documentazione sull'API pubblica rubino della gemma. Commenti nell'origine sono utili, ma concentrati su tipi di dati, ecc

+1

Anche se è già nel pacchetto, ciò non significa che sia * attualmente * installato. Non penso che tu possa sfuggire al salvataggio di LoadError. –

+0

Un buon punto, ma facciamo finta, per motivi di SCIENCE, che non si tratti di LoadError;) –

+0

È possibile che si desideri esaminare il codice GraphViz di Bundler per il disegno, poiché mostra come una porzione esterna di codice decide cosa è connesso. (Questa è una supposizione, non una risposta) – joelparkerhenderson

risposta

11

Bundler viene utilizzato per impostare le gemme applicazioni, in modo da poter utilizzare l'API Gem piuttosto che :

Gem.loaded_specs.has_key? gem_name 

Bundler volontà hanno impostato le cose in modo che tutte le gemme nel gruppo (nei gruppi appropriati) siano state attivate (quindi avranno voci in loaded_specs) e qualsiasi altra gemma (non in bundle) verrà impedita dal caricamento.

+2

Questo è il modo corretto per controllare. Bundler non fornisce un'API Ruby pubblica ufficiale in questo momento. – indirect