2012-04-05 15 views
5

Weiß jemand, wie genau der Asset Digest-Wert berechnet wird? Wenn ich zwei JS-Dateien habe, die verschiedene andere enthaltene JS-Skripte enthalten, dann behält jede Datei denselben Digest-Hash bei, wenn keines der inneren Skripte geändert wurde? Oder wird ein neuer Digest-Wert jedes Mal berechnet, wenn das Asset: Vorkompilierungsoperation ausgeführt wird?Rails Asset Pipeline- und Digest-Werte

Antwort

1

Grabbed von rails guides

Wenn ein Dateiname ist einzigartig und basiert auf deren Inhalt, HTTP-Header können eingestellt werden Caches überall zu fördern (ob bei CDNs, bei ISPs, in Netzwerk-Equipment, oder in Web Browser), um ihre eigene Kopie von den Inhalt zu behalten. Wenn der Inhalt aktualisiert wird, ändert sich der Fingerabdruck. Dadurch werden die Remote-Clients aufgefordert, eine neue Kopie des Inhalts anzufordern. Dies wird allgemein als Cache-Busting bezeichnet.

Die Technik, die Rails für Fingerabdruck verwendet, besteht darin, einen Hash des Inhalts in den Namen normalerweise am Ende einzufügen. Zum Beispiel könnte eine CSS-Datei global.css mit einem MD5-Digest seines Inhalts

+0

Also ist eine einfache md5_file() Operation auf die endgültige Datei durchgeführt, nachdem alle Zusammenführung und Komprimierung durchgeführt wird? Dieser md5-Wert endet als Digest für die Datei korrekt? – matsko

+0

Laut den Dokumenten, ja. Sie können auf [ein anderer Leitfaden] (http://guides.rubyonrails.org/asset_pipeline.html#in-production) für weitere Details verweisen. – Tomato

41

Die akzeptierte Antwort ist ganz richtig nicht umbenannt werden. Wir erstellen statische Assets für unsere Staging-, Demo- und Produktionsserver und das gleiche Asset erhält jeweils unterschiedliche Digest-Werte.

Es stellt sich heraus, dass die Rails-Umgebung ebenfalls in Betracht gezogen wird. Pinion schafft den Digest wie folgt:

# 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 Haken in Ketten wie folgt:

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

So Schienen ist eine Ketten Umgebung zu schaffen, die eine Version gleich der Rails-Umgebung hat, und Zahnräder verwendet die Version beim Erstellen der Digest-Klasse.

+0

Dies ist die richtige Antwort. – Litmus

+1

Danke für diesen. Ich musste den Digest meiner Assets ändern, um den Cloudflare-Cache ungültig zu machen, ohne den Inhalt der Asset-Dateien zu ändern. Ändern der config.assets.version von "1.0" auf "1.1" ändert die Signatur;) – luigi7up