2012-08-22 7 views
12

Come posso forzare assetic a rendere le risorse ogni volta che la pagina viene ricaricata (non importa se le risorse sono modificate o meno)?Come posso forzare assetic a rendere le risorse ogni volta che la pagina viene ricaricata?

Maggiori spiegazioni circa il mio problema:

Attualmente sto lavorando su un progetto Symfony2 in cui io uso Assetic per gestire e compilare i file .less. Ho tutto per funzionare bene, ma ho un piccolo problema che vorrei risolvere.

In config.yml, ho impostato assetic use_controller su true.

# Assetic Configuration 
assetic: 
debug:   %kernel.debug% 
use_controller: true 

Il risultato è che Symfony rende dinamicamente i nuovi file css file ogni volta .less vengono modificati. È grandioso

Il mio problema è che io uso un file project.less principale dove ho importare tutti gli altri file .less

// Import Twitter Bootstrap 
@import "../../../../../../vendor/twitter/bootstrap/less/bootstrap.less"; 

// Import Foo 
@import "foo.less"; 

... 

mi permette di mantenere una struttura pulita e anche per importare i file .less dai fornitori, ad esempio: twitter bootstrap.

Nel mio modello Twig, chiamo solo questo file principale.

{% stylesheets '@ProjectWebBundle/Resources/public/less/project.less' filter='less' %} 
     <link rel="stylesheet" type="text/css" media="screen" href="{{ asset_url }}" /> 
{% endstylesheets %}  

Poiché questo file .less principale non viene mai modificato, Assetic non ricompila le risorse. Questo è il motivo per cui mi piacerebbe che i file non fossero importati se fossero stati modificati o meno.

+0

Prova '{% fogli di stile '@ ProjectWebBundle/Resources/public/inferiore/project.less' filter = 'meno' di debug = true}%' – Florent

+0

Grazie per la risposta @Florent veloce ma non risolve il problema. – Evarouss

risposta

0

È necessario passare a use_controller: false e compilare le risorse dopo aver completato la modifica.

Se vuoi compilare il vostro patrimonio:

php app/console assetic:dump 
+2

Funziona. Comunque significa che ogni volta che modifico un file, devo eseguire quel comando. Questo è un dolore. Se aggiungo un parametro --watch al comando, ho lo stesso identico problema descritto sopra. – Evarouss

3

ho creato a simple script per risolvere questo problema. Per favore provalo e fammi sapere se è stato utile.

#!/bin/bash 

# assetic-watch: A very simple shell-script to recursively and efficiently 
# watch for asset changes and to trigger automatic recompilation. 
# 
# By Slava Fomin II <[email protected]> 
# Feel free to contact me. 
# From Russia with Love. 
# Let's make this World a Better place! 
# -------------------------------------- 

#===============# 
# CONFIGURATION # 
#===============# 

# Path relative to "Symfony/src" directory. 
# File changes under specified directory will trigger recompilation 
# of all assets. 
WATCH_PATH="Name/Bundle/NameBundle/Resources/public/css" 

# Environment. 
ENV="dev" 

# Additional options for "app/console". 
OPTS="" 

# inotifywait events to watch for. 
INW_EVENTS="close_write,moved_to,create" 

# Optional inotifywait arguments. 
INW_OPTS="" 

# Relative path to the Symfony root directory. 
SYMFONY_PATH="../" 

#============# 
# PROCESSING # 
#============# 

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" 
CONSOLE_PATH="$SCRIPT_DIR/${SYMFONY_PATH}/app/console" 
SRC_PATH="$SCRIPT_DIR/${SYMFONY_PATH}/src/$WATCH_PATH" 

quietly() { "[email protected]" > /dev/null 2>&1; } 

while true; do 
    quietly inotifywait --recursive -e $INW_EVENTS $INW_OPTS $SRC_PATH 
    php $CONSOLE_PATH assetic:dump --env=$ENV $OPTS 
done 

spero davvero sviluppatori Symfony affronterà la questione in futuro versioni del fascio Assetic. Credo che sia un limite serio.

+0

Non posso ringraziarti abbastanza. l'ultima volta che ho provato questo, non funzionava per me, ma ora il mio invito. è un po 'diverso. Questa è l'unica soluzione finora che funziona per autorifresh CSS che è @ importato, usando live.js. Grazie mille! Ho passato troppo tempo alla ricerca di soluzioni, e ho pensato che avrei fatto il giro completo a te, perché so che la tua sceneggiatura è sconcertante. Alla fine ha pagato :-) – blamb

+0

Oh, grazie @BrianThomas, il mio piacere di aiutare =) Non sto più usando assetic da solo, sono passato a Grunt e ora a Gulp per compilare automaticamente tutti i miei script. È un modo molto flessibile e potente per gestire le risorse. Puoi anche usare il fegato con esso. –

+0

Sono d'accordo, è una cosa molto ragionevole da fare. Per favore, sentiti libero di modificare la mia risposta e aggiungere un esempio di codice. –

10

Per quanto ne sappia non c'è soluzione perfetta per questo ancora

io uso:

php app/console assetic:dump --watch 

che compilare il .less file ogni volta che rileva un cambiamento in uno qualsiasi dei file .less referenziati i tuoi modelli.

A forza una compilation è necessario apportare qualsiasi modifica nel file "principale" (il file che @importa gli altri). Ma la buona notizia è che basta solo "toccare" il file per farlo.Quindi, si può solo toccare manualmente ogni volta che avete bisogno:

touch ~/web/css/main.less; 

Oppure, quello che faccio di solito è quello di creare uno script che tocca questo "principale" file ogni 60 secondi o giù di lì:

while true; do 
    sleep 60 
    touch ~/web/css/main.less 
done 

Questo dovrebbe funzionare su linux e mac.

Spero che aiuti. Almeno temporaneamente :)

11

Sto utilizzando il filtro Lessphp di Assetic che memorizza anche i file nella cache. Per quanto mi riguarda ho creato una classe che estende filtro predefinito di Assetic e tocca tutti i file con il tempo corrente

<?php 

namespace Xxx\AssetsBundle\Assetic\Filter; 

use Assetic\Asset\AssetInterface; 
use Assetic\Filter\LessphpFilter; 

class LessphpNonCachedFilter extends LessphpFilter 
{ 
    public function filterLoad(AssetInterface $asset) 
    { 
     $root = $asset->getSourceRoot(); 
     $path = $asset->getSourcePath(); 

     $filename = realpath($root . '/' . $path); 

     if (file_exists($filename)) { 
      touch($filename); 
     } 

     parent::filterLoad($asset); 
    } 
} 

E si deve impostare "assetic.filter.lessphp.class" nella sezione dei parametri (services.yml):

parameters: 
    assetic.filter.lessphp.class: Xxx\AssetsBundle\Assetic\Filter\LessphpNonCachedFilter 
+0

Nota: touch richiede i permessi di scrittura. Dovrai assicurarti che il tuo file 'project.less' abbia le autorizzazioni xx6 impostate. (Ho impostato il mio su 0666.) – Kevin

+0

non funziona per me (symfony 2.1.2) – timaschew

+0

Sto usando 'LESS' tramite' node', Il principio 'touch' rimane lo stesso,' touch' il file '(es: bootstrap.less) 'nel tuo controller' __construct() '- Forza la ricompilazione di ogni caricamento della pagina – Anil

Problemi correlati