2012-07-10 12 views
12

Estoy usando Assetic con el filtro de brújula para pasar y compilar archivos .scss. Esta parte de la configuración parece funcionar bien. Sin embargo, tengo entendido que en el entorno app_dev, Symfony 2 recompilará todos los activos (incluido css) para cada carga de página y no usará el sistema de almacenamiento en caché que emplea para el entorno de producción.Activos estáticos que no se actualizan con symfony2 borra el comando de caché

Parece que esto no está sucediendo.

Cuando hago un cambio en un archivo .scss que sólo tendrá efecto si uso:

app/console cache:clear 

pensé que el punto central del entorno de desarrollo era evitar tener que hacer esto cada vez ?!

He comprobado los permisos de las carpetas de caché (para estar seguro las he configurado para que todos puedan leer y escribir). ¿Alguien tiene alguna sugerencia?

+0

Uso Symfony con ** menos ** y lo recompila en cada solicitud, siempre y cuando los cambios estén en el archivo incluido y no en los archivos importados de ese. Tal vez ese es tu problema? – solarc

Respuesta

10

creo que he encontrado la respuesta aquí:

assetic compass filter, css not updating when changing imported file (google groups discussion)

Parece que si se hace un cambio a un archivo importado sin ningún cambio en el archivo principal entonces el padre archivo no será recompilado El resultado es que el cambio no se verá hasta que fuerce la recompilación.

El póster en grupos de google sugirió una posible solución (¡hack!) Editando el AsseticController. Todavía no lo he probado, pero incluso si funciona, prefiero no editar un paquete de proveedor.

3

La compilación de activos no es parte del sistema de almacenamiento en caché. Debe volver a instalar los activos cuando realice cambios, independientemente del entorno.

app/console assets:install web 

Si el sistema de archivos que está en soporte enlaces simbólicos, puede evitar tener que ejecutar este comando para cada cambio y en su lugar sólo tiene que instalar los activos como tales

app/console assets:install web --symlink 

Pero ya que estás usando Sass, esto probablemente no es una opción para ti.

HTH

+0

Lo siento Peter, debería haber sido más claro. Solo estoy hablando de archivos de activos (css, js) no activos como imágenes. En los documentos (http://symfony.com/doc/current/cookbook/assetic/asset_management.html) indica que en el entorno de desarrollo, estos activos se manejan dinámicamente y los cambios deben verse inmediatamente. – musoNic80

3

Sé que este es un tema antiguo, pero las únicas respuestas que pude solucionar fueron el CompassElephantBundle y el hack AsseticController anterior. Tengo un enfoque que es esencialmente, pero significa que no tuve que editar el paquete del proveedor.

La forma en que lo he hecho es editar copiar el AsseticController original y luego vincularlo a eso en la configuración desde los parámetros.

parameters: 
    assetic.controller.class: Acme\RandomBundle\Controller\AsseticController 

El AsseticController copiado simplemente hace un preg_match para el tipo de archivo de la ruta de origen y corrige el almacenamiento en caché de allí.

<?php 

/* Original Assetic Controller */ 

public function render($name, $pos = null) 
{ 
    if (!$this->enableProfiler && null !== $this->profiler) { 
     $this->profiler->disable(); 
    } 

    if (!$this->am->has($name)) { 
     throw new NotFoundHttpException(sprintf('The "%s" asset could not be found.', $name)); 
    } 

    $asset = $this->am->get($name); 
    if (null !== $pos && !$asset = $this->findAssetLeaf($asset, $pos)) { 
     throw new NotFoundHttpException(sprintf('The "%s" asset does not include a leaf at position %d.', $name, $pos)); 
    } 

    $bustCache = preg_match('/\.(scss|sass|less)$/', $asset->getSourcePath()); 

    $response = $this->createResponse(); 
    $response->setExpires(new \DateTime()); 

    if ($bustCache) { 
     $lastModified = time(); 
     $date = new \DateTime(); 
     $date->setTimestamp($lastModified); 
     $response->setLastModified($date); 
    } 
    else 
    { 
     // last-modified 
     if (null !== $lastModified = $asset->getLastModified()) { 
      $date = new \DateTime(); 
      $date->setTimestamp($lastModified); 
      $response->setLastModified($date); 
     } 
    } 

    // etag 
    if ($this->am->hasFormula($name)) { 
     $formula = $this->am->getFormula($name); 
     $formula['last_modified'] = $lastModified; 
     $response->setETag(md5(serialize($formula))); 
    } 

    if ($response->isNotModified($this->request)) { 
     return $response; 
    } 

    if ($bustCache) { 
     $response->setContent($asset->dump()); 
    } 
    else { 
     $response->setContent($this->cachifyAsset($asset)->dump()); 
    } 

    return $response; 
} 

/* Rest of controller */ 
13

si está trabajando con symfony 2 assets in dev. entorno, simplemente use this command:

php app/console assets:install 
php app/console assetic:dump --watch 

Desde la versión 2.4 --watch is deprecated, y ha sido reemplazado por:

php app/console assetic:watch 
+0

detalles: http://symfony.com/blog/new-in-symfony-2-6-smarter-assets-install-command y http://symfony.com/doc/current/cookbook/assetic/asset_management.html – Dung

2

he fijado este problema en el desarrollo local mediante la adición de una línea al final de mi parameters.yml, que básicamente se detiene almacenamiento temporal de activos se llevara a cabo.

# parameters.yml 
... 

assetic.cache.class: Assetic\Cache\ArrayCache 

Esto debería Nunca ser incluido en un entorno de producción como el almacenamiento en caché queremos que suceda!

0

Uso de manera diferente. Estoy agregando todos los archivos .scss durante el desarrollo

{% block stylesheets %} 
     {% stylesheets filter='?uglifycss' filter='cssrewrite' filter="compass" 
      "@TESTSSassBundle/Resources/public/css/_vars.scss" <-- this will be removed 
      "@TESTSSassBundle/Resources/public/css/main.scss" 
      "@TESTSSassBundle/Resources/public/css/header.scss" 
      "@TESTSSassBundle/Resources/public/css/footer.scss" 
     %} 
      <link rel="stylesheet" href="{{ asset_url }}" /> 
     {% endstylesheets %} 
    {% endblock %} 

y después de terminar el desarrollo los elimino. De esta forma no necesito borrar mi caché y agregar/cambiar ninguna configuración. Siempre me funciona.

Cuestiones relacionadas