confusione su autoload_paths vs eager_load_paths in rails 4

Ho letto un post sui binari load_paths, ecco il link .

Ma sono ancora confuso dalla differenza tra autoload_paths e eager_load_paths :

Li ho testati in un progetto Rails 4 appena creato. Sembra che corrano allo stesso modo, che si ricaricano automaticamente nella modalità di sviluppo ma nella modalità di produzione.

Autore dell’articolo collegato qui. Ecco un tentativo di chiarire la confusione, uscendo dalla risposta di @fkreusch.

In Ruby devi richiedere ogni file .rb per poter eseguire il suo codice. Tuttavia, nota come in Rails non hai mai specificamente richiesto nessuno dei tuoi modelli, controller o altri file app/ dir. Perché? Questo perché nell’app Rails app/* è in autoload_paths . Ciò significa che quando si esegue l’app per le guide in fase di sviluppo (ad esempio tramite la rails console ), nessuno dei modelli e dei controller è effettivamente richiesto da Ruby. Rails usa una caratteristica magica speciale di ruby ​​per attendere fino a che il codice menziona una costante, ad esempio Book , e solo allora eseguirà require 'book' che trova in uno dei percorsi autoload_paths . Questo ti dà un avvio più veloce della console e del server in fase di sviluppo, perché non viene richiesto nulla all’avvio, solo quando il codice ne ha effettivamente bisogno.

Ora, questo comportamento è buono per lo sviluppo locale, ma per quanto riguarda la produzione? Immagina che in produzione il tuo server faccia lo stesso tipo di caricamento a caricamento costante (autoloading). Non è davvero la fine del mondo, si avvia il server in produzione e le persone iniziano a sfogliare le pagine un po ‘più lentamente, perché alcuni dei file dovranno essere caricati automaticamente. Sì, è più lento per quelle poche richieste iniziali, mentre il server si “scalda”, ma non è poi così male. Tranne che non è la fine della storia.

Se stai correndo su Ruby 1.9.x (se ricordo male), allora l’auto-richiesta di file come quello non è thread-safe. Quindi se stai usando un server come puma, ti imbatterai in problemi. Anche se non si utilizza un server multi-thread, è comunque meglio avere l’intera applicazione richiesta “in modo proattivo” all’avvio. Ciò significa che in fase di produzione desideri che tutti i modelli, tutti i controller, ecc. Siano completamente necessari all’avvio della tua app e non ti preoccupa il tempo di avvio più lungo. Questo si chiama caricamento avido. Tutti i file ruby ​​vengono caricati con entusiasmo, capito? Ma come puoi farlo, se la tua app non ha una singola istruzione? Ecco dove entrano eager_load_paths . Qualunque cosa tu inserisca, tutti i file in tutte le directory sottostanti a quei percorsi saranno richiesti all’avvio in produzione. Spero che questo chiarisca tutto.

È importante notare che eager_load_paths non sono attivi nell’ambiente di sviluppo, quindi tutto ciò che viene inserito non sarà richiesto immediatamente nello sviluppo, ma solo nella produzione.

È anche importante notare che il solo inserimento di qualcosa in autoload_paths non lo renderà carico di entusiasmo durante la produzione. Purtroppo. Devi metterlo esplicitamente anche in eager_load_paths .

Un’altra stranezza interessante è che in ogni app di rotaie, tutte le directory sotto app/ sono automaticamente in autoload_paths e eager_load_paths , il che significa che l’aggiunta di una directory non richiede ulteriori azioni.

Fondamentalmente, autoload_paths sono percorsi che i Rails useranno per provare a caricare automaticamente le tue classi. Ad esempio, quando chiami Book , se quella class non è ancora stata caricata, passerà attraverso i percorsi autoload_paths e cercherà in quei percorsi.

In produzione, potrebbe essere preferibile caricarli anticipatamente per evitare problemi concomitanti di caricamento automatico. Per questo, fornisce i eager_load_paths . I percorsi in tale elenco saranno richiesti in anticipo all’avvio dell’applicazione.