2012-07-19 5 views
5

Sto lavorando con un team di sviluppatori e usiamo tutti lo stesso Gemfile dal nostro repository. Dato che sto lavorando su un Mac, e altri stanno usando Ubuntu, abbiamo un file Gemfile.local.example nel nostro repository che contiene le gemme di notifica appropriate per ogni sistema operativo, tutte commentate.Come posso utilizzare più Gemfiles per la mia applicazione?

Non ho commentato le gemme per il mio sistema operativo e salvato come un nuovo file, non nel controllo di versione, Gemfile.local. Ora mi piacerebbe "bundle install" per installare gemme da entrambi i file.

Non riesco a trovare alcuna documentazione valida per farlo.

+2

Eventuali duplicati di http://stackoverflow.com/questions/7962743/bundler-load-multiple-gemfiles – Conner

risposta

5

Sono d'accordo che l'uso di due Gemfiles è cattiva pratica, e hanno trovato una soluzione che prevede la costante RUBY_PLATFORM insieme con la bandiera platform nel mio Gemfile. Questa potrebbe non essere la soluzione più elegante, ma funziona per me.

Ecco un pezzo del mio codice per i lettori curiosi:

group :development, :test do 
    # Mac OSX notifications 
    gem 'growl_notify' if RUBY_PLATFORM.downcase.include?("darwin") 
    gem 'growl' if RUBY_PLATFORM.downcase.include?("darwin") 

    # Gnome notifications => aka for Linux 
    gem 'libnotify' if RUBY_PLATFORM.downcase.include?("linux") 

    # Guard-spork doesn't work with windows but it's 
    # awesome for other Operating Systems. 
    gem 'guard-spork' if RUBY_PLATFORM.downcase.include?('darwin') || RUBY_PLATFORM.downcase.include?('linux') 

    # Windows Rubies (RubyInstaller) 
    platforms :mswin, :mingw do 
    # Windows notifications 
    gem 'rb-notifu' 
    end 
end 
7

Perché non usare uno Gemfile e utilizzare lo groups o utilizzare il flag :platform per installare solo alcune gemme su OS X e altri su Ubuntu?

Sembra abbastanza ingombrante avere due Gemfiles. È possibile fornire il Gemfile da utilizzare a bundle config (man page) se si desidera che lo sia in questo caso, suppongo.

+0

Ciò è impressionante, ero non a conoscenza dell'opzione di piattaforma. Ho usato condizionali nel mio Gemfile con una costante RUBY_PLATFORM. Molto più pulito! –

+0

L'utilizzo della flag ": platform" sembra essere la soluzione più elegante, ma sembra che "platform: ruby" faccia riferimento a OSX e Ubuntu, mentre "platform: mswin,: mingw" fa riferimento a Windows. Devo specificare tra OSX e Ubuntu. [Questa pagina] (http://yopefonic.wordpress.com/2011/06/23/multi-platform-ruby-development-with-bundler/) suggerisce l'uso della costante RUBY_PLATFORM. C'è un altro modo? – dudeitsdevin90

0

Si dovrebbe utilizzare lo stesso Gemfile e dovrebbe circolare anche un master Gemfile.lock. Almeno questo è l'ideale.

Ricordare che è possibile utilizzare Ruby per differenziare le sezioni caricate da Bundle.setup ed è possibile utilizzare i gruppi per definire le cose che sono rilevanti solo per una determinata piattaforma.

Il Gemfile.lock dovrebbe rappresentare i requisiti specifici per il modo in cui viene distribuita l'applicazione. Dovrebbe essere nel sistema di controllo della versione, quindi non c'è confusione su quale versione verrà lanciata l'applicazione. Se sono presenti problemi relativi alla piattaforma, è necessario prestare attenzione a ciò che si utilizza e, laddove richiesto, bloccare le dipendenze solo dal gruppo :development.

1

Non sono sicuro della compatibilità multipiattaforma (sembra che supporti solo OS X), ma sarebbe opportuno esaminare i gemsets di RVM. Lo uso sul mio Mac al lavoro e funziona magnificamente.

RVM mi consente di creare e utilizzare più configurazioni gemset eseguendo il comando rvm use. Le gemme sono installate nel gemset che sto usando attualmente, quindi non devi preoccuparti dei conflitti nel tuo gemset globale.

https://rvm.io//