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
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
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.
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
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