2011-01-04 15 views
32

Ho a ruby gem che ha dipendenze diverse per ogni SO. Devo scrivere in modo esplicito tutti loro:Rubygems: come posso aggiungere una dipendenza specifica della piattaforma?

In Mac OS X:

gem install livereload 

su Linux:

gem install rb-inotify livereload 

su Windows:

gem install eventmachine-win32 win32-changenotify win32-event livereload 

Posso modificare un gemspec un po 'quindi inst di installazione le razioni sembrerebbero semplici gem install livereload per ogni sistema operativo?

+0

Sembra una buona idea controllare come [listen] (https://github.com/guard/listen) gem gestisce le sue dipendenze specifiche della piattaforma: [rb-inotify] (https://github.com)/nex3/rb-inotify) e [rb-fsevent] (https://github.com/thibaudgg/rb-fsevent). – skalee

risposta

20

Il modo corretto per eseguire questa operazione è delineato here. Poiché il gemspec viene valutato al momento del pacchetto, è necessario farlo in un'estensione nativa. Non preoccuparti, non è così spaventoso dal suo codice ancora solo Ruby (non compilare C o altro).

Attualmente stiamo utilizzando questo approccio per alcuni strumenti client per OpenShift (source). Quindi nel tuo gemspec/Rakefile, invece di aggiungere dipendenze, dovresti aggiungere un'estensione. Si noti che il file deve essere denominato ext/mkrf_conf.rb affinché funzioni.

+0

Il tuo link sorgente non funziona. Inoltre: non sarebbe possibile semplicemente aggiungere tutte le gemme come dipendenze in Gemspec e richiederle in base alla piattaforma? ('require 'gemname' se RbConfig :: CONFIG ['target_os'] = ~/freebsd/i') – Automatico

+2

@ Cort3z ti manca un punto importante. La soluzione che descrivi funziona, ma risolve il problema di ** non usando ** la dipendenza gem per alcuni SO dopo l'installazione. Il problema originale è ** non installare ** la dipendenza del tutto. – i4niac

+0

Ecco il mio esempio. Ho un set di strumenti sviluppati internamente che combinano un numero di script os shell e ruby ​​che usiamo per iOS, Android developemtn e altre attività. È tutto racchiuso in una gemma Ruby. Per iOS abbiamo dipendenze come _xcodeproj_, _cocoapods_, _calabash-cetriolo_. Queste gemme non verranno installate su sistemi operativi diversi da OSX, semplicemente perché hanno bisogno di strumenti da riga di comando Xcode, simulatore iOS e altre cose. Ma voglio ancora poter installare la gemma su Linux per utilizzare gli script Android. Non userò alcun strumento iOS su Linux, ma è anche importante che quelli non siano installati. – i4niac

Problemi correlati