2012-08-22 10 views
12

¿Cómo puedo forzar a assetic a presentar activos cada vez que se vuelve a cargar la página (no importa si los activos están modificados o no)?¿Cómo puedo forzar a assetic a presentar activos cada vez que la página se vuelve a cargar?

Más explicación sobre mi problema:

Actualmente estoy trabajando en un proyecto Symfony2 donde uso Assetic para administrar y compilar archivos .less. Tengo todo para que funcione bien, pero tengo un pequeño problema que me gustaría solucionar.

En config.yml, configuré el control de uso_activo como verdadero.

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

El resultado es que Symfony hace dinámicamente los nuevos archivos .css archivos cada vez .less se modifican. Esto es genial.

Mi problema es que yo uso un archivo project.less principal donde puedo importar todos los otros archivos .less

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

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

... 

que me permite mantener una estructura limpia y también para importar archivos .less de los vendedores, por ejemplo: twitter bootstrap.

En mi plantilla Twig, solo llamo a este archivo principal.

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

Dado que este archivo .less principal nunca se modifica, Assetic no vuelve a compilar los activos. Es por eso que me gustaría que los archivos no importen si han sido modificados o no.

+0

Try '{% hojas de estilo '@ ProjectWebBundle/Resources/public/menos/project.less' filtro de depuración = 'menos' = true%}' – Florent

+0

Gracias por su respuesta rápida @Florent pero no resuelve el problema. – Evarouss

Respuesta

0

Debe pasar a use_controller: false y compilar sus activos después de terminar su modificación.

Si desea compilar sus activos:

php app/console assetic:dump 
+2

Funciona. Sin embargo, significa que cada vez que modifico un archivo, tengo que ejecutar ese comando. Esto es un dolor Si agrego un parámetro --watch al comando, entonces tengo exactamente el mismo problema que el descrito anteriormente. – Evarouss

3

que he creado a simple script para resolver este problema. Por favor pruébalo y avísame si te ayudó.

#!/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 

realmente espero desarrolladores Symfony abordarán esta cuestión en las futuras versiones del paquete Assetic. Creo que es una limitación seria.

+0

no puedo agradecer lo suficiente. La última vez que probé esto, no funcionó para mí, pero ahora mi env. es un poco diferente Esta es la ÚNICA solución hasta el momento que funciona para recuperar automáticamente CSS que está @imported, usando live.js. ¡Gracias un montón! Pasé demasiado tiempo buscando soluciones, y pensé en volver a escribirles, porque sé que tu guión es genial. Finalmente valió la pena :-) – blamb

+0

Gracias, @BrianThomas, es un placer ayudar =) Ya no estoy usando assetic, cambié a Grunt y ahora a Gulp para compilar todos mis scripts automáticamente. Es una forma muy flexible y poderosa de administrar los activos. Incluso puedes usar livereload con él. –

+0

Estoy de acuerdo, es algo muy razonable de hacer. Por favor, siéntase libre de editar mi respuesta y agregar código de muestra. –

10

yo sepa no hay ninguna solución perfecta para este todavía

que utilizo:

php app/console assetic:dump --watch 

que compilar su .less archivos cada vez que se detecta un cambio en cualquiera de los archivos que se hace referencia en .less tus plantillas

Para force compilación, tiene que hacer cualquier cambio en su archivo "principal" (el archivo que @importa a los demás). Pero, las buenas noticias son que es suficiente para "tocar" el archivo para hacer eso.Por lo que sólo se puede tocar manualmente cada vez que se necesita:

touch ~/web/css/main.less; 

O, lo que suelo hacer es configurar un script que toca este "principal" archivo cada 60 segundos o así:

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

Esto debería funcionar en linux y mac.

Espero que ayude. Al menos temporalmente :)

11

Estoy usando el filtro Lessphp de Assetic que también almacena en caché los archivos. Por mi parte he creado una clase que se extiende filtro predeterminado de Assetic y toca todos los archivos con la hora actual

<?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); 
    } 
} 

Y debe establecer "assetic.filter.lessphp.class" en su sección de parámetros (services.yml):

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

Nota: touch requiere permisos de escritura. Deberá asegurarse de que su archivo 'project.less' tenga los permisos xx6 establecidos. (Configuré el mío en 0666.) – Kevin

+0

no funcionan para mí (Symfony 2.1.2) – timaschew

+0

Estoy usando 'LESS' mediante' node', el principio 'touch' se mantiene igual,' touch' the file '(por ejemplo: bootstrap.less) 'en su controlador' __construct() '- Forzará la recompilación de cada carga de la página – Anil

Cuestiones relacionadas