2012-04-06 6 views
14

Sono relativamente nuovo a RoR e sono curioso di sapere perché Rails compila risorse con e senza hash MD5 per la produzione?Rails compila risorse con e senza hash MD5, perché?

corro bundle exec rake assets:clean poi bundle exec rake assets:precompile

Il mio file production.rb:

MyApp::Application.configure do 

    # Code is not reloaded between requests 

    config.cache_classes = true 

    # Full error reports are disabled and caching is turned on 

    config.consider_all_requests_local  = false 

    config.action_controller.perform_caching = true 

    # Disable Rails's static asset server (Apache or nginx will already do this) 

    config.serve_static_assets = false 

    # Compress JavaScripts and CSS 

    config.assets.compress = true 

    # Don't fallback to assets pipeline if a precompiled asset is missed 

    config.assets.compile = false 

    # Generate digests for assets URLs 

    config.assets.digest = true 

    config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx 

    config.assets.precompile += %w(tos.js, tos.css) 

    config.i18n.fallbacks = true 

    config.active_support.deprecation = :notify 

end 

La mia applicazione funziona con i file con gli hash nei loro nomi ed è il modo in cui dovrebbe essere nel mio caso :)

Quindi ho due domande qui:

1) Perché succede quando viene compilato?

Rails compila attivi con e senza hash MD5 per la produzione

2) Quali sono questi file (senza hash) per?

Forse non capisco qualcosa, quindi per favore qualcuno potrebbe spiegarlo.

risposta

14

Il motivo è che è possibile accedere ai file senza conoscere l'impronta digitale MD5 (ad esempio in un'applicazione non-rail o un file all'interno dell'app rails che non è compilato o eseguito dallo stack rails (ad esempio una pagina di errore di stato 500/502). In questo caso dovresti compilare le risorse, quindi cambiare i link css/js nei file HTML statici ogni volta che hai aggiornato il codice (causando così una modifica dell'hash MD5).

Così, invece rotaie produce 2 copie di ogni file di asset, uno con l'impronta digitale nel nome del file, l'altro senza (ad esempio applicazioni 731bc240b0e8dbe7f2e6783811d2151a.css e application.css). la versione impronte digitali è ovviamente preferibile (si veda 'what is fingerprinting and why should I care 'nel rails asset pipeline guide). Ma il non digerire la versione ed è lì come una riserva.

Come ultima riflessione sull'argomento, prendo una lettura della seguente richiesta di pull al repository git rails: https://github.com/rails/rails/pull/5379 dove stanno discutendo i pro e i contro dei nomi di file non digeriti e la possibilità di essere in grado di per disattivare la compilazione di loro.

HTH

+0

Ciao Chris grazie per la risposta e la spiegazione, ho pensato che ho un po 'di errori di configurazione che ha causato questo comportamento. Se questo è il modo in cui dovrebbe essere, allora va bene per me. Grazie ancora. –

+1

D'altra parte, l'installazione di mio Rails ha la stessa configurazione della sua, ma è SOLO compila risorse con l'impronta digitale e non sta compilando le versioni senza l'impronta digitale. Questo è molto fastidioso per le ragioni elencate da Chris Bailey. Qualche idea su come posso risolvere questo problema? – NudeCanalTroll

+2

@NudeCanalTroll: non stai eseguendo "asset rake: precompilare: non più". – jpatokal