2012-04-05 5 views
5

Qualcuno sa esattamente come viene calcolato il valore del digest di asset? Se ho due file JS che contengono vari altri script JS inclusi, ciascun file manterrà lo stesso hash digest se nessuno degli script interni è stato modificato? O è un nuovo valore di digest calcolato ogni volta che viene eseguito l'asset: viene eseguita l'operazione di precompilazione?Pipeline di asset Rails e valori digest

risposta

1

afferrò da rails guides

Quando un nome è unico e in base al suo contenuto, le intestazioni HTTP possono essere impostate per incoraggiare le cache ovunque (sia a CDN, a fornitori di servizi Internet, in apparecchiature di rete, o in web browser) per mantenere la propria copia di del contenuto. Quando il contenuto viene aggiornato, l'impronta digitale cambia. In questo modo i client remoti potranno richiedere una nuova copia del contenuto di . Questo è generalmente noto come busting della cache.

La tecnica che Rails utilizza per il rilevamento delle impronte digitali consiste nell'inserire un hash del contenuto nel nome, solitamente alla fine. Per esempio un file CSS global.css potrebbe essere rinominato con un MD5 digest del suo contenuto

+0

Quindi una semplice operazione md5_file() eseguita sul file finale dopo l'unione e la compressione viene eseguita? Quel valore md5 finisce per essere il digest per il file corretto? – matsko

+0

Secondo i documenti, sì. Puoi fare riferimento a [un'altra guida] (http://guides.rubyonrails.org/asset_pipeline.html#in-production) per maggiori dettagli. – Tomato

41

La risposta accettata non è del tutto vero. Costruiamo risorse statiche per i nostri server di staging, demo e produzione, e lo stesso asset viene fornito con valori di digest diversi in ciascun caso.

Si scopre che anche l'ambiente Rails viene preso in considerazione. Pignoni crea il digest come segue:

# Sprockets::Environment::initialize 
@digest_class = ::Digest::MD5 

# Sprockets::Base::digest 
@digest ||= digest_class.new.update(VERSION).update(version.to_s) 

# Sprockets::Base::file_digest(path) 
digest.file(path.to_s) 

# Sprockets::Asset::initialize 
@digest = environment.file_digest(pathname).hexdigest 

Rails uncini nelle ruote dentate come segue:

# Sprockets::Railtie 
app.assets = Sprockets::Environment.new(app.root.to_s) do |env| 
    env.version = ::Rails.env + "-#{config.assets.version}" 
    ... 
end 

Così Rails è la creazione di un ambiente di ruote dentate che ha una versione uguale per l'ambiente Rails, e Pignoni utilizza la versione quando si crea la classe digest.

+0

Questa è la risposta corretta. – Litmus

+1

Grazie per questo. Ho dovuto modificare il digest delle mie risorse per invalidare la cache di Cloudflare senza modificare il contenuto dei file delle risorse. Cambiare la config.assets.version da "1.0" a "1.1" cambia la firma;) – luigi7up