2012-05-02 10 views
5

No estoy seguro de que estoy haciendo las cosas bien, pero aquí está el problema:django-compresor: Usando lessc en modo de depuración

  • estoy usando django-compressor con el preprocesador lessc
  • Algunas de las Los archivos LESS tienen URL de imagen relativa. Algunos son míos, algunos son bibliotecas 3 ª parte (por ejemplo Bootstrap)
  • Cuando COMPRESS_ENABLED es True, todo está funcionando bien
  • Cuando COMPRESS_ENABLED es False, la CssAbsoluteFilter no se está ejecutando ya, lo que significa que todas las URL de imagen relativos se mantienen relativa y por lo tanto se rompen (ya que no son relativa desde el directorio CACHE)

pude llegar a una estructura de directorios "inteligente", donde las rutas relativas se resuelven en el mismo archivo si se originan desde el CACHE directorio o desde el directorio de archivos LESS, pero eso parece una solución frágil.

¿Cómo se suele trabajar cuando se trata de LESS + django-compressor?

+0

Me parece un error en django_compressor: los precompiladores siempre reciben llamadas, pero los filtros solo se producen al comprimir. – Greg

+0

Sí, eso es exactamente lo que sucede, por lo que no es un error, ya que funciona según lo documentado. Pero como no es lo que * desea *, en mi humilde opinión, me pregunto si me estoy perdiendo algo o simplemente lo estoy usando mal. – Ludovic

+0

Parece que es un caso que simplemente no ha sido considerado por los desarrolladores de django_compressor ... definitivamente es un problema, si no es un error. ¿Has intentado escribir un script precompilador para convertir tus URL? – Greg

Respuesta

7

Se puede utilizar una solución simple:

COMPRESS_PRECOMPILERS = (
    ('text/less', 'path.to.precompilers.LessFilter'), 
) 

precompilers.py:

from compressor.filters.base import CompilerFilter 
from compressor.filters.css_default import CssAbsoluteFilter 

class LessFilter(CompilerFilter): 
    def __init__(self, content, attrs, **kwargs): 
     super(LessFilter, self).__init__(content, command='lessc {infile} {outfile}', **kwargs) 

    def input(self, **kwargs): 
     content = super(LessFilter, self).input(**kwargs) 
     return CssAbsoluteFilter(content).input(**kwargs) 

Tenga en cuenta que esto funciona tanto con COMPRESS_ENABLED = True y False.

0

En caso de que esté utilizando libsass django-el código del filtro se parece a esto:

from compressor.filters.css_default import CssAbsoluteFilter 
from django_libsass import SassCompiler 


class PatchedSCSSCompiler(SassCompiler): 
    def input(self, **kwargs): 
     content = super(PatchedSCSSCompiler, self).input(**kwargs) 
     return CssAbsoluteFilter(content).input(**kwargs) 

Y luego en el archivo de configuración:

COMPRESS_PRECOMPILERS = (
    ('text/x-scss', 'path.to.PatchedSCSSCompiler'), 
) 
1

Esto se ha corregido en django-compresor 1.6 . Desde el changelog:

Apply CssAbsoluteFilter to precompiled css even when compression is disabled 

es decir, el filtro absoluto se ejecuta en sus archivos, incluso con menos debug = true.

Cuestiones relacionadas