2012-01-24 17 views
9

Aquí está el escenario:¿Cuál debería ser mi LESS @import path?

Estoy ejecutando Django 1.3.1, utilizando archivos estáticos, y django-compressor (último estable) para, entre otras cosas, compilar archivos LESS.

Tengo un directorio de "activos" enganchado en archivos estáticos con STATICFILES_DIRS (para recursos estáticos de todo el proyecto). En ese directorio tengo un directorio "css" y en él un archivo "lib.less" que contiene variables y mixins LESS.

Así que la ruta física es <project_root>/assets/css/lib.less y se sirve en /static/css/lib.less.

En uno de los directorios estáticos de mis aplicaciones, tengo otro archivo LESS que necesita importar el anterior. La ruta física para eso es <project_root>/myapp/static/myapp/css/file.less y se publicará en /static/myapp/css/file.less.

Mi primer pensamiento fue:

@import "../../css/lib.less" 

(es decir, basado en la URL, sube a niveles de /static/myapp/css a /static/, a continuación, descender dentro de /static/css/lib.less).

Sin embargo, eso no funciona, y he probado casi todas las combinaciones de URLs y caminos físicos que puedo pensar y todos ellos me dan FilterError s en la plantilla, como resultado de no poder encontrar el archivo para importar

¿Alguien tiene alguna idea de cuál debería ser la ruta de importación real?

Respuesta

11

Después de rastrear exactamente de dónde venía el error en la fuente django-compressor. Resulta ser pasado directamente desde el caparazón. Lo cual me ayudó a eliminar todas las variables y, literalmente, a intentar obtener el compilador lessc para analizar el archivo.

Resulta que quiere una ruta de acceso relativa del archivo de origen al archivo que se importará en términos de la ruta del sistema de archivos físico. Así que tuve que retroceder hasta mi <project_root> y luego hacer referencia al assets/css/lib.less desde allí. La importación real que finalmente funcionó fue:

@import "../../../../assets/css/lib.less" 

Lo que es muy extraño es que aunque sería lessc no aceptar una ruta de sistema de archivos absoluta (es decir /path/to/project/assets/css/lib.less). No estoy seguro por qué.

ACTUALIZACIÓN (02/08/2012)

tuvo un momento completo "DUH" cuando finalmente me empujó mi código a mi entorno de ensayo y corrí collectstatic. La ruta @import que estaba usando funcionó bien en desarrollo porque esa era la ruta física al archivo luego, pero una vez que collectstatic lo hizo, todo se movió y se relacionó con <project_root>/static/.

Jugué con la idea de usar enlaces simbólicos para tratar de hacer coincidir las rutas previas y posteriores collectstatic @import, pero decidí que eso era demasiado complicado y frágil a largo plazo.

SO ...Me rompí y moví todos los archivos LESS juntos bajo <project_root>/assets/css/, y racionalicé moviendo los archivos LESS de las aplicaciones porque como están vinculados a un archivo de nivel de proyecto para funcionar, son inherentemente a nivel de proyecto.

+0

Blah! Creo que tendré que hacer lo mismo ... Mi compilador dev local no está al tanto de los archivos estáticos de django ... así que incluso si modifico mi flujo de trabajo para ejecutar collectstatic localmente, mi compilador modificaría los archivos en/static/dir. . Un poco desafortunado. ¿Terminaste usando archivos estáticos para todo menos CSS? –

+0

Terminé moviendo mis menos archivos a 'assets/less/products.less' y eliminé la estructura de la carpeta de la aplicación. Una aplicación con todos sus activos se siente tan limpia, ¡es una pena que se haya ido! –

+1

Tal vez me esté perdiendo algo, pero ¿por qué no simplemente configurar 'lessc' con algunas rutas de inclusión que lo hacen para que no tenga que usar esas rutas relativas? Puede que no sea ideal o namespace-y, pero tampoco es tu solución. – tmandry

4

Tengo el mismo problema y esto es lo que he propuesto para las versiones más recientes de compressor y lessc para integrar con archivos estáticos. Esperemos que esto ayude a otras personas

Por lo que puedo decir al experimentar, lessc no tiene una noción de rutas absolutas o relativas. Más bien, parece mantener una ruta de búsqueda, que incluye el directorio actual, el directorio que contiene de los menos de archivos, y todo lo que pasa a ella a través --include-path

así que en mi configuración para el compresor puse

COMPRESS_PRECOMPILERS = (
    ('text/less', 'lessc --include-path=%s {infile} {outfile}' % STATIC_ROOT), 
) 

Decir, después de ejecutar collectstatic que viven en el arranque

STATIC_ROOT/bootstrap/3.2.0/bootstrap.css. 

Luego de cualquier archivo de menos, ahora puedo escribir

@import (less, reference) "/bootstrap/3.2.0/bootstrap.css" 

que me permite utilizar las clases de arranque como menos mixins en cualquiera de mis archivos menos!

Cada vez que actualizo un archivo menos, tengo que ejecutar collectstatic para agregarlos en un directorio local para que el compresor pueda proporcionar less los archivos fuente correctos para trabajar. De lo contrario, el compresor maneja todo sin problemas. También puede usar collectstatic -l para crear un enlace simbólico, lo que significa que solo necesita recopilar los archivos cuando agrega uno nuevo.

estoy considerando implementar un comando de gestión para suavizar el proceso de desarrollo que sea subclases runserver para llamar collectstatic cada vez que se vuelve a cargar el servidor, o utiliza django.utils.autoreload directamente a llamar collectstatic cuando las cosas se actualizan.

Editar (12/01/2014): Mi enfoque como se describe anteriormente requiere una raíz estática local. Estaba usando el almacenamiento remoto con compresión fuera de línea en mi entorno de producción, por lo que la implementación requiere un par de pasos adicionales. Además de llamar al collectstatic para sincronizar los archivos estáticos con el almacenamiento remoto, llamo al collectstatic con un archivo de configuración django diferente que usa almacenamiento local. Después de haber recopilado los archivos localmente, puedo llamar a 'compress', configurándolo para cargar los archivos de resultados al almacenamiento remoto, pero busque en el almacenamiento local los archivos fuente.

Cuestiones relacionadas