2014-04-20 6 views
5

Ich teste meine Rails 4 App in der Produktionsumgebung auf meinem localhost: 3000 mit dem eingebauten Webrick Server. Wenn ich RAILS_ENV=production bundle exec rake assets:precompile ausführen, werden die Assets in der Öffentlichkeit neu erstellt und das Manifest wird neu erstellt, aber die Seiten werden weiterhin mit den vorherigen Asset-Namen geliefert.Wie kann ich den Rails-Server dazu bringen, vorkompilierte Assets zu aktualisieren?

Beim Neustart des Rails-Servers werden die neuen Elemente angezeigt. Gibt es einen weniger extremen Weg, dies zu erreichen, und wie wird sich dies verhalten, wenn ich dies auf meinen Produktionsserver portiere, auf dem Phusion Passenger läuft? Ich möchte Apache wirklich nicht neu starten, um meine Assets in Gang zu bringen.

+0

Ist Fingerabdruck für kompilierte Assets aktiviert? –

+0

Ja, die kompilierten Assets sind Fingerabdrücke. Die Konfiguration ist Standard Rails 4 mit Ausnahme von 'config.serve_static_assets = true', das benötigt wird, um Webrick dazu zu bringen, Assets von'/public' bereitzustellen, 'config.assets.digest = true' ist gesetzt. Die Assets haben Namen wie 'application-01d7312dee865ebe9d525b15f2fbe7f0.css', dies ist der Wert, der in der Seitenkopfzeile steht. Das Problem ist, dass die alte Version immer noch verwendet wird, nachdem eine neue Version erstellt wurde. –

+0

Ältere Version bedeutet, haben Sie den Inhalt geändert? Wenn Sie den Inhalt von Assets nicht geändert haben, ist die vorkompilierte Version dieselbe wie die vorherige und wenn Sie sie ein wenig ändern, ändert sich der Fingerabdruck und die App wird nur nach dem neuen fragen, da Sie 'config 'eingestellt haben. assets.digest = true'. –

Antwort

3

Wenn Sie den Inhalt von Assets nicht geändert haben, entspricht die vorkompilierte Version der vorherigen Version. Wenn Sie es ein wenig ändern, wird sich der Fingerabdruck ändern und die App wird nur nach dem neuen anfordern, wie Sie config.assets.digest = true festgelegt haben.

Auf jeden Fall um eine andere Arbeit wäre:

Führen Sie einfach:

rake assets:clean 

und dann

rake assets:precompile 

Dies alles in der Asset-Pipeline macht frisch umgebaut und dienen werden.

Rails löscht automatisch den Cache für jede einzelne Datei, wenn der Inhalt bearbeitet wird.

Wenn eine der oben genannten nicht funktioniert, versuchen Sie es wie folgt:

config.serve_static_assets = true in config/Umgebungen/production.rb

config.serve_static_assets konfiguriert Rails selbst statische Vermögenswerte zu dienen. Der Standardwert ist "Wahr", wird jedoch in der Produktionsumgebung deaktiviert, da die zum Ausführen der Anwendung verwendete Serversoftware (z. B. Nginx oder Apache) stattdessen statische Assets bereitstellen sollte. Im Gegensatz zur Standardeinstellung setzen Sie dies beim Ausführen auf "true" (absolut nicht empfohlen!) Oder testen Sie Ihre App im Produktionsmodus mit WEBrick. Andernfalls können Sie das Seiten-Caching nicht verwenden und Anfragen für Dateien, die regelmäßig unter dem öffentlichen Verzeichnis vorhanden sind, werden auf jeden Fall Ihre Rails-App betreffen.

Ref: http://guides.rubyonrails.org/configuring.html#rails-general-configuration

Hoffe, es hilft :)

+0

Danke für die Antwort, aber natürlich habe ich den Inhalt geändert, und ich habe sowohl 'Rake Assets: clean' und' Rake assets: clobber' und 'serve_static_assets = true' ausprobiert. Ich habe fast jeden Führer online gelesen, der nach einer Antwort sucht, bevor er hier schreibt. Ich denke, das könnte tatsächlich eine Art Caching-Problem sein. –

+0

@PeterWooster Haben Sie versucht, den Inhalt von 'public/assets' manuell zu löschen, um zu sehen, was passiert? – roshiro

+0

@roshiro Löschen von öffentlichen/Assets macht die Website wie 1996 aussehen, keine Stile kein Javascript. –

1

Wir standen vor dem gleichen Problem, wo die alten Werte, selbst, die gedient wurden nach einer Rake Vermögen versuchen: reinigen oder Vermögenswerte: clobber und schließlich Neustart des Servers würde das beheben Problem. Der Schuldige in unserem Fall war Einhorn. Während wir unsere Rails App mit mina und mina-unicorn implementiert haben, haben wir Rake-Assets ausgeführt: clobber, dann kompilierte Assets und am Ende ein Einhorn neu gestartet. Dadurch wird der Einhorn-Meister niemals gestoppt und zeigt weiterhin alte Werte an. Also haben wir unser mina deploy-Skript geändert und anstatt das Einhorn neu zu starten, haben wir das Einhorn gestoppt und es wieder gestartet. Dies hat das Problem behoben.So sind die wichtigsten Schritte

  1. Deploy Anwendung

  2. Lauf Rake Vermögen: clobber

  3. Lauf Rake Vermögen: precompile

  4. Anschlag Einhorn

  5. Einhorn starten

Dadurch wird das Konzept der Null-Ausfallzeit umgangen, aber dies ist eine bessere Lösung als der Neustart des Servers.

Ich verstehe, dass Sie Passagier verwenden, aber diese Informationen können für andere hilfreich sein

Verwandte Themen