Statisches Asset-Caching auf Heroku mit Jammit durch Ändern von ActionController::Base#page_cache_directory

StackOverflow https://stackoverflow.com/questions/4977780

  •  12-11-2019
  •  | 
  •  

Frage

Ich versuche, Jammit zum Packen von CSS und JS für eine auf Heroku bereitgestellte Rails-App zu verwenden, was aufgrund des schreibgeschützten Dateisystems von Heroku nicht sofort funktioniert.In jedem Beispiel, das ich dafür gesehen habe, wird empfohlen, alle gepackten Asset-Dateien im Voraus zu erstellen.Aufgrund der Git-basierten Bereitstellung von Heroku bedeutet dies, dass Sie jedes Mal, wenn sich diese Dateien ändern, einen separaten Commit für Ihr Repository durchführen müssen, was für mich keine akzeptable Lösung ist.Stattdessen möchte ich den Pfad ändern, den Jammit zum Schreiben der zwischengespeicherten Pakete verwendet #{Rails.root}/tmp/assets (durch Austausch ActionController::Base#page_cache_directory), das auf Heroku geschrieben werden kann.

Was ich nicht verstehe, ist, wie die zwischengespeicherten Dateien verwendet werden, ohne jedes Mal auf den Rails-Stack zuzugreifen, selbst wenn der Standardpfad für zwischengespeicherte Pakete verwendet wird.Lassen Sie mich erklären, was ich meine:

Wenn Sie ein Paket mit Jammits Helfer einbinden, sieht es in etwa so aus:

<%= include_javascripts :application %>

wodurch dieses Skript-Tag generiert wird:

<script src="/assets/application.js" type="text/javascript"></script>

Wenn der Browser diese URL anfordert, wird sie tatsächlich weitergeleitet Jammit::Controller#package, das den Inhalt des Pakets im Browser rendert und dann eine zwischengespeicherte Kopie dorthin schreibt #{page_cache_directory}/assets/application.js.Die Idee ist, dass diese zwischengespeicherte Datei auf der ersten Anfrage erstellt wird und nachfolgende Anfragen die zwischengespeicherte Datei direkt bereitstellen sollten, ohne den Rails-Stack zu treffen.Ich habe den Jammit-Code durchgesehen und verstehe nicht, wie das passieren soll.Was verhindert spätere Anfragen an /assets/application.js vom einfachen Routing zu Jammit::Controller noch einmal und nie die zwischengespeicherte Datei verwenden?

Ich vermute, dass es irgendwo, was ich nicht sehe, eine Rack-Middleware gibt, die die Datei bereitstellt, wenn sie vorhanden ist, und die Anforderung an den Controller weiterleitet, wenn dies nicht der Fall ist.Wenn das der Fall ist, wo ist dieser Code?Und wie würde es beim Wechsel funktionieren? ActionController::Base#page_cache_directory (Ändert effektiv, wo Jammit zwischengespeicherte Pakete schreibt)?Seit #{Rails.root}/tmp über dem Stammverzeichnis des öffentlichen Dokuments liegt, gibt es keine URL, die diesem Pfad zugeordnet ist.

War es hilfreich?

Lösung

Tolle Frage!Ich habe das nicht selbst eingerichtet, aber es ist etwas, das ich mir schon immer anschauen wollte, also haben Sie mich dazu aufgefordert.Hier ist, was ich versuchen würde (ich werde es bald selbst versuchen, aber Sie werden mir wahrscheinlich zuvorkommen).

config.action_controller.page_cache_directory = "#{Rails.root}/tmp/page_cache"

Ändern Sie nun Ihre config.ru in:

require ::File.expand_path('../config/environment',  __FILE__)
run Rack::URLMap.new(
   "/"       => Your::App.new,
   "/assets" => Rack::Directory.new("tmp/page_cache/assets"))

Achte nur darauf, dass nichts drin ist public/assets, da das nie aufgegriffen wird.

Anmerkungen:

  • Dies ist für Rails 3.Ich bin mir der Lösung unter Rails 2 nicht sicher.
  • Es sieht aus wie Rack::Directory Setzt Cache-Kontrollheader auf 12 Stunden, damit Heroku Ihre Assets in Varnish zwischenspeichert.Ich bin mir nicht sicher, ob Jammit dies in seinem Controller einstellt, aber selbst wenn nicht, wird es ziemlich schnell zwischengespeichert.
  • Auch Heroku geht unter ENV['TMPDIR'] jetzt auch, sodass Sie das stattdessen verwenden können Rails.root + '/tmp' wenn Sie wünschen.

Andere Tipps

Das könnte nützlich sein, es ist für ein anderes Juwel, aber die Idee ist ähnlich und ich versuche, es mit den einfachen Asset-Helfern zum Laufen zu bringen.

http://devcenter.heroku.com/articles/using-compass

Leider scheint es ziemlich schwierig zu sein, Rails dazu zu bringen, dies zu tun, ohne das Asset-Helfer-Modul zu patchen/neu zu schreiben (das gekoppelten Spaghetti ähnelt).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top