Django-compressor: Pas moyen de faire fonctionner cela sur Heroku

Créé le 6 mars 2014  ·  24Commentaires  ·  Source: django-compressor/django-compressor

Rechercher sur le Web ne semble pas être un moyen simple de faire fonctionner cela sur heroku.

J'ai pensé que mettre tout sur S3 comme c'est la méthode recommandée par heroku pour les fichiers serait la voie à suivre. Puis j'ai lu ceci : http://django-compressor.readthedocs.org/en/latest/remote-storages/
ce qui est bien, mais après avoir fait cela, il ne dit pas quel est le résultat. Est-ce que je lance collectstatic, compress, les deux ? Est-ce que je le fais localement ou est-ce que je laisse le crochet heroku le faire pour moi ? Ou est-ce que je désactive en fait le heroku collectstatic parce que je n'ai pas lessc &co dans l'environnement heroku de toute façon.

Donc, au moins, ce serait un bogue de documentation pour cette page : http://django-compressor.readthedocs.org/en/latest/remote-storages/

En principe, cela devrait également fonctionner sur heroku si vous générez tout hors ligne et que vous les enregistrez dans votre contrôle de version, n'est-ce pas ?

Il y a ces articles sur la configuration de node and less dans l'environnement heroku mais ils semblent un peu excessifs et ne fonctionnent en fait pas :
http://marklmiddleton.com/2013/using-less-with-django-on-heroku/
http://www.sore.nu/blog/2012/dec/30/fieldguide-django-bootstrap-less-coffeescript-and-/

Est-ce que je manque quelque chose ici? Après avoir passé une demi-journée dessus hier, j'abandonne (l'alternative claire consiste à tout compiler localement à l'aide des outils frontaux standard).

deployment

Commentaire le plus utile

OK, voici quelque chose qui fonctionne pour moi et qui a survécu au redémarrage du dyno. Mes principaux objectifs ici étaient 1) ne pas avoir besoin d'ajouter une situation complète de buildpack ruby/JS uniquement pour mon pipeline d'actifs ; 2) pas besoin de configurer S3 ; 3) le faire se produire automatiquement dans le cadre du déploiement plutôt que d'exiger des étapes locales.

Alors:

1) Configurez le bruit blanc selon les instructions de Heroku.

2) ajoutez django-libsass à vos besoins.

3) Dans votre fichier de paramètres :

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) Ajoutez un fichier bin/post_compile contenant

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

(Notez que cela doit être dans post_compile. Il ne peut pas s'agir d'une tâche de publication à cause du système de fichiers éphémère - les fichiers que vous générez pendant la compression ne resteront pas si vous les exécutez dans une tâche de publication. Mais les exécuter dans post_compile semble fonctionner, et pour survivre au redémarrage du dyno.)

Tous les 24 commentaires

Pas un bug ;)

Mais il y avait beaucoup de questions ;)

  • dans la plupart des scénarios de chargement, j'utiliserais dj-static (comme on le voit dans les docs heroku ) ou whitenoise pour servir des fichiers statiques sur heroku.
  • si tout est bien configuré, heroku exécute collectstatic pour vous lorsque vous poussez votre code
  • si vous souhaitez ajouter une compression hors ligne, vous pouvez ajouter un script post_compile (voir ici ) qui exécute la compression pour vous
  • ne compressez pas hors ligne localement, laissez heroku le faire pour vous.
  • pour installer lessc sur heroku est une autre tâche, je devrais google et essayer aussi .. Mais votre premier lien semble prometteur (au moins le script post_compile ).

Dans la section liée ci-dessus sous "Utilisation de fichiers statiques", vous ne savez toujours pas pourquoi vous devez créer votre propre sous-classe de stockage ou ce que vous devez faire après l'avoir fait.

J'ai essayé d'installer lessc sur heroku mais si le script post_compile donné ne fonctionne pas directement, c'est extrêmement fastidieux à déboguer et franchement cela ne semble pas une bonne idée de créer un conteneur avec tout et l'évier de la cuisine.

Étonné de voir à quel point c'est encore difficile, mais si quelqu'un me dit ce qui se passe ici : http://django-compressor.readthedocs.org/en/latest/remote-storages/
Je serai heureux d'ajouter un patch de documentation.

J'ai créé un fork de django-skel qui prend en charge django-compressor, la compilation scss, bower et un tas d'autres choses (et le faire fonctionner sur heroku). Est-ce que quelqu'un est intéressé à le voir?

Je pense que les gens seraient certainement intéressés à voir des choses qui fonctionnent !

@therippa : ça m'intéresserait aussi de voir ça.

Le mode en ligne de Compressor ne fonctionne pas sur Heroku car Whitenoise ne vérifie le dossier statique que lorsque l'application est chargée (voir mon commentaire sur le problème n ° 680). Pour utiliser le compresseur en production, je pense que vous devez l'utiliser en mode hors ligne et exécuter python manage.py compress avant le chargement de l'application à l'aide du hook de post-compilation de Heroku. Heroku exécutera automatiquement collect static pour vous afin que ce ne soit pas un problème. J'ai trouvé heroku-django-cookbook utile. J'utilise TypeScript sur mon application Django/Heroku, j'avais donc également besoin d'installer un nœud, etc. Cela est possible via le hook de post-compilation, un package pip personnalisé ou un pack de construction personnalisé. Je pense que le crochet post-compilation est le moyen le plus simple.

Comme j'avais ce problème en combinaison avec sekizai, l'utilisation de la compression hors ligne n'était pas vraiment une option. Mais ce problème est en fait assez facilement résolu en étendant le bruit blanc, alors voici ma solution : https://gist.github.com/Chronial/45ce9f33615a3b24c51f

Peut-être que quelqu'un veut ajouter des tests et de la documentation à cela et envoyer un PR approprié à whitenoise ? :)

Remarque : Si vous souhaitez toujours la pré-génération ou heroku, vous pouvez démarrer le serveur et envoyer des requêtes dans votre crochet post_build .

Les documents Whitenoise mentionnent django-compressor sur http://whitenoise.evans.io/en/stable/django.html#django -compressor

D'ACCORD. Cela a fonctionné pour moi brillamment!
Dans mon répertoire local racine (aka repo), j'ai créé un répertoire bin/ et à l'intérieur un fichier nommé post_compile . Dans le fichier post_compile , j'ai copié-collé ces données .
J'ai fait git add --all , git commit -m 'testing post_receive hook in Heroku' , git push heroku master .
Après l'exécution automatique de la commande collectstatic par Heroku, il a exécuté python manage.py compress et il a créé un répertoire contenant tous mes fichiers compressés dans un seul fichier !

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

Si vous voyez OfflineCompressionErrors, consultez également https://github.com/django-compressor/django-compressor/issues/443 où les gens suggèrent d'autres solutions de contournement.

dans le cas de # 831, ce qui a fonctionné est de faire une compression hors ligne localement et de pousser le résultat, y compris le manifest.json vers heroku. pas de S3 là-bas cependant.

voici une autre config qui fonctionne pour l'auteur : https://github.com/django-compressor/django-compressor/issues/855#issuecomment -303294202

OK, voici quelque chose qui fonctionne pour moi et qui a survécu au redémarrage du dyno. Mes principaux objectifs ici étaient 1) ne pas avoir besoin d'ajouter une situation complète de buildpack ruby/JS uniquement pour mon pipeline d'actifs ; 2) pas besoin de configurer S3 ; 3) le faire se produire automatiquement dans le cadre du déploiement plutôt que d'exiger des étapes locales.

Alors:

1) Configurez le bruit blanc selon les instructions de Heroku.

2) ajoutez django-libsass à vos besoins.

3) Dans votre fichier de paramètres :

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) Ajoutez un fichier bin/post_compile contenant

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

(Notez que cela doit être dans post_compile. Il ne peut pas s'agir d'une tâche de publication à cause du système de fichiers éphémère - les fichiers que vous générez pendant la compression ne resteront pas si vous les exécutez dans une tâche de publication. Mais les exécuter dans post_compile semble fonctionner, et pour survivre au redémarrage du dyno.)

La solution @thatandromeda a fonctionné pour moi, merci beaucoup !

@thatandromeda , cette solution est peut-être ce que je recherche (après 12 heures à essayer des tonnes de choses). Où va exactement bin/post_compile ? comment ferais-je pour l'ajouter ? comment puis-je dire à heroku de l'utiliser?

@manikos @thatandromeda Dois-je exécuter collectstatic avant ou après ou les deux avant et après compress ? Ma commande de gestion de compression indique que le fichier est introuvable :

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

@typistX Vous n'avez rien à dire à heroku, il détecte automatiquement si vous avez un répertoire appelé bin dans la racine de votre projet (dépôt) et s'il existe un fichier appelé post_compile (pas de fichier rallonge) à l'intérieur.

@thatandromeda Vous venez de me sauver après 3 jours à gérer cette merde. 🙏🏼

Désolé que vous ayez ce combat / content d'avoir pu vous aider !

@technolingo la compresse doit s'exécuter après collectstatic.

Les deux solutions, celle de @thatandromeda et celle de @manikos ont fonctionné pour moi, merci ! 😃
Il est confirmé qu'il ne s'agit pas d'un bogue, mais simplement d'un manque d'informations sur le processus de déploiement sur Heroku, le mentionner quelque part dans la documentation serait certainement utile.

Je serai heureux d'examiner et de fusionner toute documentation d'amélioration de demande d'extraction. Aucun des mainteneurs actifs n'a de compte heroku, c'est donc aux utilisateurs qui le font de suggérer des changements.

un bouton de déploiement en 1 clic vers heroku serait-il le bienvenu ici ? ou juste un document décrivant le déploiement d'heroku ?

@ morenoh149 À mon avis, ce qui est le plus nécessaire ici, c'est la documentation, un "bouton de déploiement en un clic" peut aider, mais lorsque je cherchais _le bogue_, je voulais savoir exactement quel était le problème.

Cette page vous a été utile?
0 / 5 - 0 notes