2013-08-23 14 views
7

Le distribuzioni di produzione richiedono alcuni minuti in più a causa del tempo necessario per installare nokogiri gem (1.6.0). Capisco che questo è dovuto al fatto che l'installazione della gem trigger attiva la compilazione dell'estensione nativa.Interruzione della ricompilazione dell'estensione nativa nell'installazione di pacchetti successiva

Nota che ho confezionato il mio fagotto e controllato in DVCS

bundle package 

C'è un modo per evitare la ricompilazione di estensioni native se non altro è cambiato, in modo che le distribuzioni sono più veloci?

Aggiornamento:

Io uso Opscode Chef per distribuire (cuoco-solo per essere precisi)

ambiente è: Ubuntu 12.04LTS 64bit Rubino 193-P448

+0

Un 'install' fascio di solito salta gemme che Bundler reperti già corrispondenti requisiti. Cosa stai usando per l'implementazione? –

+0

@NeilSlater Uso lo chef per la distribuzione. – Litmus

+0

Non ho una risposta per tutte le estensioni native, ma hai provato ad aggiungere 'NOKOGIRI_USE_SYSTEM_LIBRARIES = true'? – zrl3dx

risposta

4

ho trovato un modo per farlo. Ecco la spiegazione:

Bundler, per impostazione predefinita installa gem in una cartella puntata dalla variabile di ambiente BUNDLE_PATH. Il valore predefinito di BUNDLE_PATH è vendor/bundle. Quindi tutte le gemme sono installate nella cartella /vendor/bundle, che risulta essere una cartella privata (per ogni versione dell'applicazione Rails). Quando viene installata una nuova versione dell'applicazione Rails, non esiste. Quindi Bundler installa/precompila ogni gemma. Raccoglie le gemme da vendor/cache che è un buon risparmio rispetto al download dello stesso da rubygems.org, ma non può ancora evitare la compilazione di estensioni native.

Possiamo ignorarlo passando --path /shared/path alla riga di comando bundle install. Ciò assicurerà che le gemme siano sempre installate in /shared/path, che è accessibile a tutte le versioni (dell'applicazione Rails).

Con questo approccio, bundler non tenterà di reinstallare/ricompilare un gioiello, poiché trova lo stesso già installato.

così, questo è il comando magico che ha lavorato per me

bundle install --local --deployment --path /shared/bundle --without development test 
+0

Fai attenzione che un giorno potresti avere un'app bloccata in passato che non può utilizzare la gemma più recente. Quando ciò si verifica, potresti rammaricarti di non aver venduto le tue gemme. –

+1

Non vero. In produzione, voglio che l'app utilizzi solo le gem che sono bloccate con 'Gemfile.lock'. Gli aggiornamenti gem sono avvenuti in fase di sviluppo (usando 'bundle obsoleto' e' bundle update'). Poiché utilizzo 'bundle package', quelle gemme aggiornate sono memorizzate in' vendor/cache'.E in produzione quando eseguo 'bundle install --deployment' le nuove gemme vengono prelevate da' vendor/cache' e installate nel percorso specificato dall'opzione '--path' come spiegato sopra. – Litmus

+0

Questo è così utile e perfettamente sicuro che mi chiedo perché questo non è il comportamento predefinito quando si utilizza '--deployment'! Nokogiri è il peggior incubo di ogni deployer. –