2013-03-13 2 views
6

Ich habe viele Beiträge und Artikel und Fragen & Antworten auf die Rails Asset-Pipeline gelesen, aber ich habe immer noch nicht herausgefunden, wie Caching insgesamt zu deaktivieren.Rails 3.2.11 Asset Pipeline vom Caching verhindern?

Wir verwenden Rails 3.2.11 und in unserer Lab-Umgebung (ähnlich der Entwicklung) haben wir ein Problem, denn obwohl wir keine Assets vorkompilieren oder in der Asset-Pipeline abtun, werden sie noch zwischengespeichert der Rails (Rack?) Cache. Dies ist ärgerlich, da einige der Ressourcen ERBs sind, die sich aufgrund anderer Konfigurationen ändern, so dass der Cache veraltet wird. Um zu versuchen, das Caching deaktivieren wir diese Konfiguration festgelegt haben:

config.action_controller.perform_caching = false 

    config.assets.compress = false 

    config.assets.debug = true 

    # just in case 
    config.cache_store = :file_store, "file_cache" 

Allerdings zeigen Vermögenswerte ohnehin in tmp/cache/assets auf. Ich würde zumindest erwarten, dass sie in file_cache auftauchen, aber ich erwarte wirklich, dass sie überhaupt nicht zwischengespeichert werden.

Wie können wir verhindern, dass diese Objekte zwischengespeichert werden? Das Löschen des Cache ist in dieser Umgebung nicht ausreichend.

Bonus Frage: solange diese Dateien zwischengespeichert werden, warum sind sie in tmp/ und nicht in file_cache/?

Antwort

8

Um die Asset-Cache zu deaktivieren. Assets .cache_store nicht die Rails config.cache_store.

Beachten Sie auch, dass Sass einen separaten Cache für kompilierte Sheets hat, wird standardmäßig in tmp/cache/sass, und wenn Sie deaktivieren möchten, dass Sie das separat zu tun haben:

config.sass.cache = false 

die Bonus zu beantworten Frage, wenn der Rails Guide sagt:

der Standard Rails Cache-Speicher wird von Pinion verwendet werden Vermögenswerte in Entwicklung cachen und Produktion.

Ich dachte, sie die konfiguriert Rails Cache-Speicher verwendet werden würde gemeint. Ich habe mich geirrt, es verwendet die Standard Cache, es sei denn, Sie ändern explizit die Asset Cache.

+0

Wenn jemand hier sucht, weil seine Assets den Cache nicht wie bei der Aktualisierung ungültig machen, löste ich dieses Problem, indem ich 'config.assets.digest = true' aus meiner Konfigurationsdatei entfernte. – mltsy

-1

Um vollständig zu deaktivieren Vermögen Pipeline, können Sie diese Richtlinie in Ihrer Umgebung Datei hinzufügen:

config.assets.enabled = false 

Aber wenn Sie wollen immer noch Vermögenswerte Pipeline Kompilierung und Caching für statische JS und CSS, und gleichzeitig genießen Zeit Verwenden Sie ERB-Dateien für dynamische Assets, können Sie eine my_assets_controller erstellen und Ansichten für diesen Controller erstellen, die dynamischen Inhalt liefern (Dateien mit den Erweiterungen .css.erb und .js.erb). Sie müssen nur in Ihrer Ansicht oder Layout-Datei enthalten <%= javascript_path '/my_assets/things_dynamically_generated.js' %>

+0

Das einzige, was wir von der Asset-Pipeline im Labor haben wollen, ist die Fähigkeit, die Assets im Dateisystem zu lokalisieren, aber in der Produktion wollen wir das gesamte Caching. Wir möchten die Assets nicht neu gestalten müssen, nur um automatisches (fehlgeschlagenes) Caching zu umgehen. –

-1

Das klingt wie ein XY-Problem.

Prinzip 1: Der Build muss deterministisch und unabhängig von der Umgebungskonfiguration sein.

Prinzip 2: Die Kompilierung statischer Assets muss Teil des Builds sein.

Sie sollten in Richtung rein statische Vermögenswerte bewegen. Sie können ERBs verwenden, aber nur um Methoden wie asset_path aufzurufen, die deterministisch sind und bei gleicher Codebasis das gleiche Ergebnis liefern. Sie können konfigurationsbasierte Daten oder Verhaltensweisen dort eingeben, jedoch nur, wenn die Daten oder das Verhalten für alle Bereitstellungen (dev, test, staging, qa, pre-prod und prod) identisch sind.

Alles, was aus der Konfiguration pro Umgebung stammt, sollte nicht in die statischen Assets gelangen. Stattdessen können Sie das in HTTP-Headern, Attributen auf dem Element oder anderen Injektionstechniken bereitstellen. Der Code für statische Assets sollte intelligent genug sein, um nach den injizierten Daten in den HTTP-Headern oder den Attributen <html> zu suchen und sein Verhalten basierend auf diesen injizierten Daten zu ändern.

Wie für die Bonusfrage, ist config.cache_store nicht das steuernde Konfigurationselement für die Kettenräder, Sass, Kompass, etc Caches.

config.assets.cache_store = :null_store 

Beachten Sie, dass das heißt config:

+0

Ich stimme sowohl Prinzip 1 als auch Prinzip 2 nicht zu und nichts davon beantwortet die Frage, wie der Cache für die Asset-Pipeline deaktiviert werden soll. –