Sto lavorando su una gemma che ha bisogno di impostare le dipendenze in modo condizionale quando la gemma è installata. Ho fatto qualche ricerca intorno allocrea una gemma di rubino e specifica dipendenze condizionali
e sembra che non sia il solo a farlo.
Rubygems: How do I add platform-specific dependency?
questo è un lungo filo
http://www.ruby-forum.com/topic/957999
L'unico modo che posso vedere per aggiungere le dipendenze a una gemma è quello di utilizzare il metodo add_dependency all'interno di un blocco Gem :: Specifiction in una. file gemspec
Gem::Specification.new do |s|
# ... standard setup stuff
# conditionally set dependencies
s.add_dependency "rb-inotify", "~> 0.8.8" if RUBY_PLATFORM =~ /linux/i
s.add_dependency "rb-fsevent", "~> 0.4.3.1" if RUBY_PLATFORM =~ /darwin/i
s.add_dependency "rb-fchange", "~> 0.0.5" if RUBY_PLATFORM =~ /mswin|mingw/i
end
Sulla base di tutti i documenti e thread che ho trovato in rete, mi sarei aspettato che t se si installa la gemma sul
- Linux, quindi, rb-inotify sarebbe una dipendenza e auto-installato
- Mac - rb-fsevent sarebbe stato installato
- Windows - rb-fchange sarebbe installato
Tuttavia, sembra che non sia il caso. Le istruzioni "if" all'interno del blocco vengono valutate nel momento in cui la gemma viene creata e pacchettizzata. Pertanto, se si crea e si impacchetta la gemma su Linux, quindi, rb-inotify viene aggiunto come dipendenza, Mac, quindi, rb-fsevent, Windows - rb-fchange.
Ancora bisogno di una soluzione, ho scavato nel codice rubygems e sembra che il seguente è un ampio entusiasmo di ciò che accade.
- costruire tutto il codice per il vostro gioiello: foo.gem
- creare un file foo.gemspec
- costruire, pacchetto, e rilasciare la gemma a un server gioiello come rubygems.org
- fatecelo sapere allo
- gli sviluppatori lo installano localmente tramite: gem install foo
- il file foo.gem viene scaricato, decompresso e installato. anche tutte le dipendenze sono installate.
- tutto dovrebbe essere impostato e possiamo iniziare usando la gemma.
Sembra che quando la gemma è costruito e rilasciato il file foo.gemspec viene caricato e il blocco Gem :: specifica viene valutata e convertita in YAML, compresso come metadata.gz, e incluso nel foo.gem . Il codice ruby è compresso in data.tar.gz e incluso. Quando la gemma viene installata sul computer dello sviluppatore locale, , lo YAML viene estratto da metadata.gz e riconvertito in un blocco Gem :: Specification, tuttavia, non viene riconvertito nel blocco originale.
invece, si vedrà qualcosa di simile a quanto segue:
Gem::Specification.new do |s|
if s.respond_to? :specification_version then
s.specification_version = 3
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
s.add_runtime_dependency(%q<rb-inotify>, ["~> 0.8.8"])
else
s.add_dependency(%q<rb-inotify>, ["~> 0.8.8"])
end
else
s.add_dependency(%q<rb-inotify>, ["~> 0.8.8"])
end
end
Ok.Quindi, ho una visione a volo d'uccello del processo, tuttavia, ciò non cambia il mio desiderio di costruire un singolo gioiello e di specificare condizionalmente le dipendenze per una gamma di obiettivi del sistema operativo.
Se qualcuno ha una soluzione diversa dalla costruzione di più file .gemspec per ogni sistema operativo di destinazione ... Sono tutte orecchie !!
Guarda la mia risposta a http://stackoverflow.com/a/10249133/309514, funziona bene. – Fotios