2011-10-03 5 views
6

All'avvio di Rails, precarica tutte le sue dipendenze (gemme), il che si traduce in un avvio molto lento. In un progetto di medie dimensioni su cui sto lavorando, l'ora di inizio di Rails è di 10-15 secondi, dipende dalla macchina.Perché Rails precarica tutte le sue dipendenze (gemme) durante l'avvio?

Mentre questo non è un problema di produzione, è un enorme problema di sviluppo. Specialmente quando si lavora su TDD/BDD. Esistono soluzioni per accelerare i test (come lo spork), ma introducono problemi propri.

La mia domanda è: perché non richiedere le dipendenze necessarie in ciascuno dei file di codice, invece di precaricare tutto durante il tempo di avvio?

Quali sono gli svantaggi del manuale? Le linee extra di codice?

+0

http://stackoverflow.com/questions/3418895/how-to-reload-all-gems-in-rails-3 – jimworm

+0

Considerare l'utilizzo di autotest o strumento simile quando si lavora in stile TDD. – taro

+0

@taro Sto usando guard-rspec (fa la stessa cosa dell'autotest), ma questo non aiuta con il tempo di avvio. – arikfr

risposta

3

Rails non è PHP. Alcune risorse sono caricate automaticamente, ma tutte quelle che è probabile che siano necessarie vengono caricate all'avvio/inizializzazione perché è meglio farlo prima che le richieste vengano fatte in modo che l'applicazione sia pronta piuttosto che caricarle pigramente su richiesta, rallentando la prima richiesta Gran parte della definizione al volo dei metodi e del caricamento delle classi avviene ancora al momento, riducendo il tempo di caricamento a solo 10-15 secondi, ma se si tagliano 5-10 secondi da tale tempo di caricamento, sarebbe stato aggiunto alla prima richiesta. Non va bene, vero?

Gran parte del tempo di caricamento che si verifica è nelle gemme/plugin/librerie che si aggiungono al progetto. Molte delle dimensioni significative offrono modi per caricare solo le porzioni di cui hai bisogno e molte altre potrebbero utilizzare questa ottimizzazione. Ad esempio, se si dispone di un progetto Rails che non ha bisogno di Active Record, è possibile sostituire:

require 'rails/all' 

... con:

require "action_controller/railtie" 
require "action_mailer/railtie" 
require "active_resource/railtie" 
require "rails/test_unit/railtie" 

... nel vostro application.rb di ridurre il carico (e di evitare errori sul database non esistente).

+0

Questo ha senso, ma se il problema è solo in produzione/prima richiesta, ci sono altri modi per risolverlo. Perché imporre penalità allo sviluppo? – arikfr

+0

Per mantenere uno sviluppo e una produzione più vicini, suppongo. Rails aiuta ad alleviare il problema nello sviluppo non memorizzando nella cache molte classi, ricaricandole su ogni richiesta per te in modo da non dover interrompere e avviare il server così spesso. Se hai altri consigli su come ottenere questo, mi piacerebbe ascoltarli, e sono sicuro che il team di Rails vorrebbe vedere una patch con miglioramenti. – coreyward

+0

Non è una penalità. È il costo di fare business - si otterrebbe comunque il ritardo sul caricamento della prima pagina per il proprio server di sviluppo. Si tratta solo di un ritardo nella linea di comando o di un ritardo nel browser. – Kelly