Django-compressor: Keine Möglichkeit, dies auf Heroku zum Laufen zu bringen

Erstellt am 6. März 2014  ·  24Kommentare  ·  Quelle: django-compressor/django-compressor

Das Suchen im Internet scheint kein einfacher Weg zu sein, um dies auf Heroku zum Laufen zu bringen.

Ich dachte, dass es der richtige Weg wäre, alles auf S3 zu legen, wie es von Heroku für Dateien empfohlen wird. Dann habe ich das gelesen: http://django-compressor.readthedocs.org/en/latest/remote-storages/
was alles in Ordnung ist, aber nachdem es das getan hat, sagt es nicht, was das Ergebnis ist. Führe ich Collectstatic, Compress, beides aus? Mache ich es lokal oder lasse ich es den Heroku-Schubhaken für mich erledigen? Oder deaktiviere ich tatsächlich das Heroku-Collectstatic, weil ich ohnehin kein lessc &co in der Heroku-Umgebung habe.

Dies wäre also zumindest ein Dokumentationsfehler für diese Seite: http://django-compressor.readthedocs.org/en/latest/remote-storages/

Im Prinzip sollte das auch auf heroku funktionieren, wenn du alles offline generierst und in deine Versionskontrolle eincheckst, oder?

Es gibt diese Artikel über das Einrichten von Knoten und weniger in der Heroku-Umgebung, aber sie scheinen etwas übertrieben zu sein und funktionieren tatsächlich nicht:
http://marklmiddleton.com/2013/using-less-with-django-on-heroku/
http://www.sore.nu/blog/2012/dec/30/fieldguide-django-bootstrap-less-coffeescript-and-/

Übersehe ich hier etwas? Nachdem ich gestern einen halben Tag damit verbracht habe, gebe ich auf (die klare Alternative ist, alles lokal mit den Standard-Frontend-Tools zu kompilieren).

deployment

Hilfreichster Kommentar

OK, hier ist etwas, das für mich funktioniert und den Dyno-Neustart überstanden hat. Meine Hauptziele hier waren 1) keine ganze Ruby/JS-Buildpack-Situation nur für meine Asset-Pipeline hinzufügen zu müssen; 2) S3 muss nicht eingerichtet werden; 3) dass es automatisch als Teil der Bereitstellung geschieht, anstatt dass lokale Schritte erforderlich sind.

Damit:

1) Whitenoise gemäß den Anweisungen von Heroku konfigurieren.

2) fügen Sie django-libsass zu Ihren Anforderungen hinzu.

3) In Ihrer Einstellungsdatei:

INSTALLED_APPS += ('compressor',)

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
    'compressor.finders.CompressorFinder',
)

COMPRESS_ENABLED = True
COMPRESS_OFFLINE = True

COMPRESS_PRECOMPILERS = (
    ('text/x-sass', 'django_libsass.SassCompiler'),
    ('text/x-scss', 'django_libsass.SassCompiler'),
)

4) Fügen Sie eine bin/post_compile -Datei hinzu, die Folgendes enthält

python manage.py compress
python manage.py collectstatic --noinput

(Beachten Sie, dass dies in post_compile sein muss . Aufgrund des flüchtigen Dateisystems kann es kein Release-Task sein - die Dateien, die Sie während der Komprimierung generieren, bleiben nicht erhalten, wenn Sie sie in einem Release-Task ausführen. Aber das Ausführen in post_compile scheint zu funktionieren, und um den Dyno-Neustart zu überleben.)

Alle 24 Kommentare

Kein Fehler ;)

Aber es gab viele Fragen ;)

  • In den meisten Ladeszenarien würde ich dj-static (wie in den Heroku -Dokumenten zu sehen) oder Whitenoise verwenden , um statische Dateien auf Heroku bereitzustellen.
  • Wenn alles gut konfiguriert ist, führt Heroku collectstatic für Sie aus, wenn Sie Ihren Code übertragen
  • Wenn Sie eine Offline-Komprimierung hinzufügen möchten, können Sie ein post_compile -Skript hinzufügen (siehe hier ), das die Komprimierung für Sie ausführt
  • nicht lokal offline komprimieren, lassen Sie heroku dies für Sie tun.
  • Für die Installation lessc auf Heroku ist eine andere Aufgabe, ich müsste googeln und es auch versuchen.. Aber Ihr erster Link sieht vielversprechend aus (zumindest das post_compile- Skript).

In dem oben verlinkten Abschnitt unter "Using staticfiles" haben Sie immer noch keine Ahnung, warum Sie Ihre eigene Speicherunterklasse erstellen müssen oder was Sie tun müssen, nachdem Sie dies getan haben.

Ich habe versucht, lessc auf Heroku zu installieren, aber wenn das angegebene post_compile-Skript nicht direkt funktioniert, ist das Debuggen extrem mühsam, und ehrlich gesagt klingt es nicht nach einer guten Idee, einen Container mit allem und der Küchenspüle zu erstellen.

Erstaunt, wie schwer das immer noch ist, aber wenn mir jemand sagt, was hier passiert: http://django-compressor.readthedocs.org/en/latest/remote-storages/
Gerne füge ich einen Dokumentations-Patch hinzu.

Ich habe einen Fork von Django-Skel erstellt, der Django-Compressor, Scss-Compilation, Bower und viele andere Dinge unterstützt (und ihn auf Heroku laufen lässt). Hat jemand Interesse, es zu sehen?

Ich denke, die Leute wären definitiv daran interessiert, Dinge zu sehen, die funktionieren!

@therippa : Das würde mich auch interessieren.

Der Online-Modus von Compressor funktioniert auf Heroku nicht, da Whitenoise nur den statischen Ordner überprüft, wenn die App geladen wird (siehe meinen Kommentar zu Ausgabe Nr. 680). Um den Kompressor in der Produktion zu verwenden, müssen Sie ihn meiner Meinung nach im Offline-Modus verwenden und python manage.py compress ausführen, bevor die App mit Herokus Post-Compile-Hook geladen wird. Heroku führt automatisch Sammelstatistiken für Sie aus, sodass dies kein Problem darstellt. Ich fand Heroku-Django-Kochbuch hilfreich. Ich verwende TypeScript in meiner Django/Heroku-App, daher musste ich auch Node usw. installieren. Dies ist über den Post-Compile-Hook, ein benutzerdefiniertes Pip-Paket oder ein benutzerdefiniertes Build-Paket möglich. Ich denke, der Post-Compile-Hook ist der einfachste Weg.

Da ich dieses Problem in Kombination mit Sekizai hatte, war die Verwendung der Offline-Komprimierung keine wirkliche Option. Aber dieses Problem lässt sich eigentlich ganz einfach beheben, indem man Whitenoise erweitert, also hier ist meine Lösung: https://gist.github.com/Chronial/45ce9f33615a3b24c51f

Vielleicht möchte jemand einige Tests und Dokumentationen hinzufügen und eine ordentliche PR an whitenoise schicken? :)

Hinweis: Wenn Sie immer noch eine Vorgenerierung oder Heroku wünschen, können Sie den Server starten und einige Anfragen in Ihrem post_build -Hook senden.

Whitenoise-Dokumente erwähnen django-compressor unter http://whitenoise.evans.io/en/stable/django.html#django -compressor

OK. Das hat bei mir hervorragend funktioniert!
In meinem lokalen Root-Verzeichnis (auch bekannt als Repo) habe ich ein Verzeichnis bin/ und darin eine Datei namens post_compile erstellt. In die Datei post_compile habe ich diese Daten kopiert und eingefügt.
Ich habe git add --all , git commit -m 'testing post_receive hook in Heroku' , git push heroku master .
Nach der automatischen Ausführung des Befehls collectstatic durch Heroku wurde python manage.py compress ausgeführt und ein Verzeichnis erstellt, das alle meine Dateien komprimiert in einer Datei enthält!

remote:      $ python manage.py collectstatic --noinput
remote:        1247 static files copied to '/app/staticfiles'.
remote: 
remote: -----> Running post-compile hook
remote: -----> Compressing static files
remote:        Found 'compress' tags in:
remote:         /app/templates/base/base.html
remote:         /app/templates/info/areas.html
remote:         /app/templates/info/profile.html
remote:        Compressing... done
remote:        Compressed 1 block(s) from 3 template(s) for 1 context(s).

Wenn Sie OfflineCompressionErrors sehen, sehen Sie sich auch https://github.com/django-compressor/django-compressor/issues/443 an, wo Leute weitere Problemumgehungen vorschlagen.

Im Fall von #831 hat es funktioniert, die Offline-Komprimierung lokal durchzuführen und das Ergebnis einschließlich der manifest.json an heroku zu übertragen. aber kein S3 da.

Hier ist eine weitere Konfiguration, die für den Autor funktioniert: https://github.com/django-compressor/django-compressor/issues/855#issuecomment -303294202

OK, hier ist etwas, das für mich funktioniert und den Dyno-Neustart überstanden hat. Meine Hauptziele hier waren 1) keine ganze Ruby/JS-Buildpack-Situation nur für meine Asset-Pipeline hinzufügen zu müssen; 2) S3 muss nicht eingerichtet werden; 3) dass es automatisch als Teil der Bereitstellung geschieht, anstatt dass lokale Schritte erforderlich sind.

Damit:

1) Whitenoise gemäß den Anweisungen von Heroku konfigurieren.

2) fügen Sie django-libsass zu Ihren Anforderungen hinzu.

3) In Ihrer Einstellungsdatei:

INSTALLED_APPS += ('compressor',)

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
    'compressor.finders.CompressorFinder',
)

COMPRESS_ENABLED = True
COMPRESS_OFFLINE = True

COMPRESS_PRECOMPILERS = (
    ('text/x-sass', 'django_libsass.SassCompiler'),
    ('text/x-scss', 'django_libsass.SassCompiler'),
)

4) Fügen Sie eine bin/post_compile -Datei hinzu, die Folgendes enthält

python manage.py compress
python manage.py collectstatic --noinput

(Beachten Sie, dass dies in post_compile sein muss . Aufgrund des flüchtigen Dateisystems kann es kein Release-Task sein - die Dateien, die Sie während der Komprimierung generieren, bleiben nicht erhalten, wenn Sie sie in einem Release-Task ausführen. Aber das Ausführen in post_compile scheint zu funktionieren, und um den Dyno-Neustart zu überleben.)

Die Lösung von @thatandromeda hat bei mir funktioniert, vielen Dank!

@thatandromeda Diese Lösung ist vielleicht genau das, wonach ich suche (nachdem ich 12 Stunden lang unzählige Dinge ausprobiert habe). Wo genau geht bin/post_compile hin? wie würde ich vorgehen, um es hinzuzufügen? wie sage ich heroku, dass er es benutzen soll?

@manikos @thatandromeda Soll ich collectstatic vor oder nach oder sowohl vor als auch nach compress ausführen? Mein Komprimierungsverwaltungsbefehl sagt, dass die Datei nicht gefunden wurde:

ValueError: The file 'css/font-awesome.min.css' could not be found with <whitenoise.storage.CompressedManifestStaticFilesStorage object at 0x7f3e3fc3b828>.

@typistX Sie müssen heroku nichts mitteilen, es erkennt automatisch, ob Sie ein Verzeichnis namens bin in Ihrem Projektstamm (Repo) haben und ob es eine Datei namens post_compile gibt (keine Datei Verlängerung) innen.

@thatandromeda Du hast mich gerade gerettet, nachdem du dich 3 Tage lang mit diesem Mist befasst hast. 🙏🏼

Es tut mir leid, dass Sie diesen Kampf haben / froh, dass ich helfen konnte!

@technolingo Die Komprimierung muss nach Collectstatic ausgeführt werden.

Beide Lösungen, die von @thatandromeda und die von @manikos , haben bei mir funktioniert, danke! 😃
Es wird bestätigt, dass dies kein Fehler ist, sondern nur ein Mangel an Informationen über den Bereitstellungsprozess auf Heroku, eine Erwähnung irgendwo in der Dokumentation wäre sicherlich hilfreich.

Gerne überprüfe und füge ich alle Pull-Requests zur Verbesserung der Dokumentation zusammen. Keiner der aktiven Betreuer hat ein Heroku-Konto, also ist es wirklich Sache der Benutzer, Änderungen vorzuschlagen.

Wäre eine 1-Klick-Bereitstellungsschaltfläche für Heroku hier willkommen? oder nur ein Dokument, das die Heroku-Bereitstellung schrittweise durchführt?

@morenoh149 Meiner Meinung nach wird hier am meisten Dokumentation benötigt, eine "Ein-Klick-Bereitstellungsschaltfläche" kann hilfreich sein, aber als ich nach _dem Fehler_ suchte, wollte ich wissen, was genau das Problem war.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen