2012-01-24 13 views
9

Ecco lo scenario:Quale dovrebbe essere il mio percorso LESS @import?

Sto eseguendo Django 1.3.1, utilizzando file statici e django-compressor (ultima versione stabile) per, tra le altre cose, compilare file LESS.

Ho una directory "assets" che è collegata a file statici con STATICFILES_DIRS (per risorse statiche a livello di progetto). In quella directory ho una directory "css" e in quella un file "lib.less" che contiene le variabili LESS e i mixin.

Quindi il percorso fisico è <project_root>/assets/css/lib.less ed è servito allo /static/css/lib.less.

In una delle directory statiche delle mie app, ho un altro file LESS che deve importare quello in alto. Il percorso fisico per questo è <project_root>/myapp/static/myapp/css/file.less e verrà servito allo /static/myapp/css/file.less.

Il mio primo pensiero è stato:

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

(vale a dire in base alla URL, salire a livelli da /static/myapp/css a /static/, poi traversare giù in /static/css/lib.less).

Tuttavia, questo non funziona, e ho provato praticamente tutte le combinazioni di URL e percorsi fisici a cui riesco a pensare e tutti loro mi danno FilterError s nel modello, risultanti dal non riuscire a trovare il file da importare.

Qualcuno ha qualche idea su quale dovrebbe essere il percorso di importazione effettivo?

risposta

11

Dopo aver individuato esattamente da dove proveniva l'errore nella sorgente del compressore django. Risulta essere passato direttamente dalla shell. Il che mi ha aiutato a rimuovere tutte le variabili e, letteralmente, sto solo cercando di ottenere il compilatore lessc per analizzare il file.

Si scopre che vuole un percorso relativo dal file di origine al file da importare in termini di percorso fisico del file system. Quindi ho dovuto tornare indietro al mio <project_root> e quindi fare riferimento a assets/css/lib.less da lì. L'importazione reale che alla fine ha funzionato è stato:

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

Cosa c'è di molto strano è però che lessc avrebbe non accettare un percorso filesystem assoluto (cioè /path/to/project/assets/css/lib.less). Non sono sicuro del perché.

AGGIORNAMENTO (02/08/2012)

avuto un momento completo "duh" quando finalmente spinto il mio codice per il mio ambiente di staging e corsi collectstatic. Il percorso @import che stavo usando funzionava bene in fase di sviluppo perché quello era il percorso fisico del file quindi, ma una volta che collectstatic ha fatto la cosa, tutto viene spostato e relativo a <project_root>/static/.

Mi sono divertito con l'idea di utilizzare collegamenti simbolici per cercare di abbinare i percorsi di pre e post-collectstatic @import, ma ho deciso che era troppo complicato e fragile a lungo termine.

SO ...Ho interrotto e spostato tutti i file LESS insieme sotto <project_root>/assets/css/ e ho razionalizzato lo spostamento dei file LESS fuori dalle app perché poiché sono legati a un file a livello di progetto per funzionare, sono intrinsecamente a livello di progetto.

+0

Blah! Penso che dovrò fare lo stesso ... Il mio compilatore di dev locale non è a conoscenza dei file statici di django .. quindi anche se ho modificato il mio flusso di lavoro per eseguire collectstatic localmente, il mio compilatore avrebbe modificato i file nella directory/static /. Un po 'sfortunato. Hai finito per utilizzare ancora i file statici per tutto tranne i CSS? –

+0

Alla fine ho spostato i miei file meno in 'assets/less/products.less' e rimosso la struttura della cartella dell'app. Un'app con tutte le sue risorse sembra così pulita, è troppo male se n'è andata! –

+1

Forse mi manca qualcosa, ma perché non configurare semplicemente 'lessc' con alcuni percorsi di inclusione che lo rendono così non devi usare quei percorsi relativi? Potrebbe non essere ideale o namespace-y, ma nemmeno la tua soluzione. – tmandry

4

Sono un po 'nello stesso bind e questo è quello che mi è venuto in mente per le versioni più recenti di compressore e lessc da integrare con file statici. Speriamo che questo possa aiutare alcune altre persone fuori

Per quanto ne so dalla sperimentazione, lessc non ha una nozione di percorsi assoluti o relativi. Piuttosto, sembra mantenere un percorso di ricerca, che include la directory corrente, il contenente directory del file di meno, e tutto ciò che passa per via --include-path

così nella mia configurazione per compressore ho messo

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

Dire, dopo l'esecuzione di collectstatic ho vivono bootstrap a

STATIC_ROOT/bootstrap/3.2.0/bootstrap.css. 

Poi da qualsiasi file di meno, ora posso scrivere

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

che mi permette di usare le classi di bootstrap come meno mixin in uno dei miei file meno!

Ogni volta che aggiorno un file meno, devo eseguire collectstatic per aggregarli in una directory locale in modo che il compressore possa dare a less i file di origine corretti su cui lavorare. Altrimenti, il compressore maneggia tutto senza problemi. Puoi anche usare collectstatic -l in collegamento simbolico, il che significa che devi solo raccogliere i file quando ne aggiungi uno nuovo.

sto valutando l'attuazione di un comando di gestione per lisciare il processo di sviluppo che sia sottoclassi runserver di chiamare collectstatic ogni volta che il server viene ricaricato, o utilizza django.utils.autoreload direttamente chiamare collectstatic quando le cose vengono aggiornati.

Modifica (2014/12/01): Il mio approccio come descritto sopra richiede una radice statica locale. Stavo usando lo storage remoto con compressione offline nel mio ambiente di produzione, quindi l'implementazione richiede un paio di passaggi aggiuntivi. Oltre a chiamare collectstatic per sincronizzare i file statici nella memoria remota, chiamo collectstatic con un diverso file di configurazione django che utilizza la memoria locale. Dopo aver raccolto i file localmente, posso chiamare "compress", dopo averlo configurato per caricare i file dei risultati nell'archiviazione remota, ma cercare nella memoria locale i file di origine.

Problemi correlati