Django-compressor: No hay forma de hacer que esto funcione en Heroku

Creado en 6 mar. 2014  ·  24Comentarios  ·  Fuente: django-compressor/django-compressor

Buscando en la web no parece una forma sencilla de hacer que esto funcione en heroku.

Pensé que poner todo en S3 como es la forma recomendada por Heroku para los archivos sería el camino a seguir. Luego leí esto: http://django-compressor.readthedocs.org/en/latest/remote-storages/
lo cual está bien, pero después de haber hecho eso no dice cuál es el resultado. ¿Ejecuto collectstatic, compress, ambos? ¿Lo hago localmente o dejo que el gancho de empuje heroku lo haga por mí? ¿O, de hecho, deshabilito heroku collectstatic porque de todos modos no tengo lessc & co en el entorno de heroku?

Entonces, al menos, esto sería un error de documentación para esta página: http://django-compressor.readthedocs.org/en/latest/remote-storages/

En principio, esto también debería funcionar en heroku si genera todo sin conexión y lo verifica en su control de versión, ¿verdad?

Hay estos artículos sobre la configuración de nodos y menos en el entorno de heroku, pero parecen un poco excesivos y, de hecho, no funcionan:
http://marklmiddleton.com/2013/using-less-with-django-on-heroku/
http://www.sore.nu/blog/2012/dec/30/fieldguide-django-bootstrap-less-coffeescript-and-/

¿Me estoy perdiendo algo aquí? Después de pasar medio día en esto ayer, me doy por vencido (la alternativa clara es compilar todo localmente usando las herramientas front-end estándar).

deployment

Comentario más útil

Bien, aquí hay algo que funciona para mí y ha sobrevivido al reinicio del dinamómetro. Mis objetivos clave aquí fueron 1) no necesitar agregar una situación completa de Ruby/JS buildpack únicamente para mi tubería de activos; 2) no es necesario configurar S3; 3) hacer que suceda automáticamente como parte de la implementación en lugar de requerir pasos locales.

Entonces:

1) Configure el ruido blanco de acuerdo con las instrucciones de Heroku.

2) agregue django-libsass a sus requisitos.

3) En su archivo de configuración:

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) Agregue un archivo bin/post_compile que contenga

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

(Tenga en cuenta que esto debe estar en post_compile. No puede ser una tarea de lanzamiento debido al sistema de archivos efímero: los archivos que genera durante la compresión no se mantendrán si los ejecuta en una tarea de lanzamiento. Pero ejecutarlos en post_compile parece funcionar, y para sobrevivir al reinicio del dinamómetro).

Todos 24 comentarios

No es un error ;)

Pero había muchas preguntas ;)

  • en la mayoría de los escenarios de carga, usaría dj-static (como se ve en los documentos de heroku ) o whitenoise para servir archivos estáticos en heroku.
  • si todo está bien configurado, heroku ejecuta collectstatic cuando presionas tu código
  • si desea agregar compresión fuera de línea, puede agregar un script post_compile (ver aquí ) que ejecuta la compresión por usted
  • no comprima localmente fuera de línea, deje que heroku lo haga por usted.
  • para instalar lessc en heroku es otra tarea, tendría que buscar en Google e intentarlo también... Pero su primer enlace parece prometedor (al menos el script post_compile ).

En la sección vinculada anteriormente en "Uso de archivos estáticos", todavía no tengo idea de por qué necesita crear su propia subclase de almacenamiento o qué debe hacer después de haberlo hecho.

Intenté instalar lessc en heroku, pero si el script post_compile proporcionado no funciona directamente, es extremadamente tedioso de depurar y, francamente, no parece una buena idea crear un contenedor con todo y el fregadero de la cocina.

Sorprendido de lo difícil que es esto todavía, pero si alguien me dice qué está pasando aquí: http://django-compressor.readthedocs.org/en/latest/remote-storages/
Estaré feliz de agregar un parche de documentación.

Creé una bifurcación de django-skel que admite django-compressor, scss compilation, bower y muchas otras cosas (y que se ejecute en heroku). ¿Alguien está interesado en verlo?

¡Creo que la gente definitivamente estaría interesada en ver cosas que funcionan!

@therippa : Yo también estaría interesado en ver eso.

El modo en línea de Compressor no funciona en Heroku porque Whitenoise solo verifica la carpeta estática cuando se carga la aplicación (consulte mi comentario sobre el problema n.º 680). Para usar el compresor en producción, creo que debe usarlo en modo sin conexión y ejecutar python manage.py compress antes de que la aplicación se cargue usando el enlace de compilación posterior de Heroku. Heroku ejecutará automáticamente la recopilación estática para que eso no sea un problema. Encontré heroku-django-cookbook útil. Estoy usando TypeScript en mi aplicación Django/Heroku, así que también necesitaba instalar el nodo, etc. Esto es posible a través del enlace de compilación posterior, un paquete pip personalizado o un paquete de compilación personalizado. Creo que el gancho de compilación posterior es la forma más fácil.

Como tuve este problema en combinación con sekizai, usar la compresión fuera de línea no era realmente una opción. Pero este problema en realidad se soluciona con bastante facilidad extendiendo el ruido blanco, así que aquí está mi solución: https://gist.github.com/Chronial/45ce9f33615a3b24c51f

¿Quizás alguien quiera agregar algunas pruebas y documentación a eso y enviar un PR adecuado a whitenoise? :)

Nota: si aún desea pregeneración o heroku, puede iniciar el servidor y enviar algunas solicitudes en su enlace post_build .

Los documentos de Whitenoise mencionan django-compressor en http://whitenoise.evans.io/en/stable/django.html#django -compressor

está bien. ¡Esto funcionó para mí brillantemente!
Dentro de mi directorio local raíz (también conocido como repositorio) creé un directorio bin/ y dentro de eso un archivo llamado post_compile . Dentro del archivo post_compile copié y pegué estos datos .
Hice git add --all , git commit -m 'testing post_receive hook in Heroku' , git push heroku master .
Después de la ejecución automática del comando collectstatic de Heroku, ejecutó python manage.py compress y creó un directorio que contiene todos mis archivos comprimidos en un solo archivo.

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 ve OfflineCompressionErrors, también consulte https://github.com/django-compressor/django-compressor/issues/443 donde las personas sugieren más soluciones.

en el caso de # 831, lo que funcionó fue hacer la compresión fuera de línea localmente y enviar el resultado, incluido manifest.json, a heroku. Sin embargo, no hay S3 allí.

aquí hay otra configuración que funciona para el autor: https://github.com/django-compressor/django-compressor/issues/855#issuecomment -303294202

Bien, aquí hay algo que funciona para mí y ha sobrevivido al reinicio del dinamómetro. Mis objetivos clave aquí fueron 1) no necesitar agregar una situación completa de Ruby/JS buildpack únicamente para mi tubería de activos; 2) no es necesario configurar S3; 3) hacer que suceda automáticamente como parte de la implementación en lugar de requerir pasos locales.

Entonces:

1) Configure el ruido blanco de acuerdo con las instrucciones de Heroku.

2) agregue django-libsass a sus requisitos.

3) En su archivo de configuración:

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) Agregue un archivo bin/post_compile que contenga

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

(Tenga en cuenta que esto debe estar en post_compile. No puede ser una tarea de lanzamiento debido al sistema de archivos efímero: los archivos que genera durante la compresión no se mantendrán si los ejecuta en una tarea de lanzamiento. Pero ejecutarlos en post_compile parece funcionar, y para sobrevivir al reinicio del dinamómetro).

La solución de @thatandromeda funcionó para mí, ¡muchas gracias!

@thatandromeda esta solución puede ser lo que estoy buscando (después de 12 horas de probar muchas cosas). ¿Dónde va exactamente bin/post_compile? ¿Cómo haría para agregarlo? ¿Cómo le digo a Heroku que lo use?

@manikos @thatandromeda ¿Debo ejecutar collectstatic antes o después o antes y después compress ? Mi comando de gestión de compresión dice archivo no encontrado:

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

@typistX No tienes que decirle nada a heroku, detecta automáticamente si tienes un directorio llamado bin en la raíz de tu proyecto (repo) y si hay un archivo llamado post_compile (sin archivo extensión) en el interior.

@thatandromeda Me acabas de salvar después de 3 días de lidiar con esta basura. 🙏🏼

Lamento que estés teniendo esta lucha / ¡Me alegro de haber podido ayudar!

@technolingo, la compresión debe ejecutarse después de collectstatic.

Ambas soluciones, la de @thatandromeda y la de @manikos me funcionaron, ¡gracias! 😃
Se confirma que esto no es un error, sino solo una falta de información sobre el proceso de implementación en Heroku, mencionarlo en algún lugar de la documentación seguramente sería de ayuda.

Estaré encantado de revisar y fusionar cualquier documentación de mejora de solicitud de incorporación de cambios. Ninguno de los mantenedores activos tiene una cuenta de heroku, por lo que depende de los usuarios sugerir cambios.

¿Sería bienvenido aquí un botón de despliegue de 1 clic para heroku? o simplemente un documento paso a paso a través de la implementación de heroku?

@ morenoh149 En mi opinión, lo que más se necesita aquí es la documentación, un "botón de implementación de 1 clic" puede ayudar, pero cuando estaba buscando _el error_ quería saber cuál era exactamente el problema.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

ghost picture ghost  ·  20Comentarios

oesah picture oesah  ·  6Comentarios

camilonova picture camilonova  ·  7Comentarios

polmuz picture polmuz  ·  20Comentarios

dasloss picture dasloss  ·  6Comentarios