Bloqueio automático de cache Assetic sem consulta?
Pergunta
Não consegui encontrar muita informação sobre isso.
Quero compilar todos os arquivos css (e js, na verdade) em algo assim:
css/all-c498dsfbc.css
No momento só consigo obter estes:
css/all.css
css/c498dsfbc.css
css/all.css?v=123
O primeiro é uma droga, porque não tem nenhum impedimento de cache.
O segundo gera um hash que pode ser usado para impedir o cache, mas por algum motivo ele não muda quando eu altero algo em meus arquivos .css e executo novamente isto:
$ php app/console assetic:dump --env=prod --no-debug
O terceiro também é uma droga porque sou obrigado a alterar a versão manualmente, conforme explicado aqui: http://symfony.com/doc/current/reference/configuration/framework.html#ref-framework-assets-version.Além disso, não acho que usar consultas para isso seja uma boa ideia (acho que alguns navegadores ou CDN podem não gostar disso).Seria muito melhor se o nome do arquivo fosse alterado:'all-c498dsfbc.css'.É assim que é feito no Rails, se bem me lembro.
Alguma ideia?
EDITAR
Parece que esse recurso está faltando, não acredito: https://github.com/kriswallsmith/assetic/pull/190
Solução
Em nosso projeto para garantir que o novo conteúdo não seja armazenado em cache pelo Varnish para cada implantação, alteramos manualmente a versão - e os ativos escolhem essa.Eu acho que é uma prática comum.Mas no nosso caso - ele salva em uma pasta como web/version-1.2.3/css/all.css
.
Nossa configuração para framework
seção:
templating:
engines: ['twig']
assets_version: %release_version%
assets_version_format: "version-%%2$s/%%1$s"
Outras dicas
Eu sei que este é um tópico antigo, mas está no topo do Google, então achei que valeria a pena atualizar:
Agora você pode fazer isso com ativos usando o trabalhador destruidor de cache.No entanto, o pacote de ativos 2.3.0 não tem a configuração para ele, então você precisa habilitá-lo manualmente por enquanto.Isso pode ser feito com a seguinte definição de serviço:
#config.yml or a service.yml
#...
services:
assetic.worker.cache_buster:
class: Assetic\Factory\Worker\CacheBustingWorker
public: false
arguments:
lazy_manager: @assetic.asset_manager
tags:
worker_factory: { name: assetic.factory_worker }
Esta solução alternativa vem da solicitação pull para a configuração do cache buster trabalhador: https://github.com/symfony/AsseticBundle/pull/119/files