资产自动缓存破坏,无需查询


Assetic automatic cache busting without query?

我找不到太多关于这方面的信息。

我想把所有css(实际上还有js)文件编译成这样的文件:

css/all-c498dsfbc.css

现在我只能得到这些:

css/all.css
css/c498dsfbc.css
css/all.css?v=123

第一个很糟糕,因为它根本没有破坏缓存。

第二个生成了一个散列,可以用于缓存破坏,但由于某种原因,当我更改.css文件中的某些内容,然后再次运行时,它不会改变:

$ php app/console assetic:dump --env=prod --no-debug

第三个也很糟糕,因为我需要手动更改版本,如下所述:http://symfony.com/doc/current/reference/configuration/framework.html#ref-框架资产版本。此外,我不认为使用查询是个好主意(我认为一些浏览器或CDN可能不喜欢这样)。如果更改文件名:"all-c498dsfbc.css"会更好。如果我没记错的话,Rails就是这样做的。

有什么想法吗?

编辑

这个功能好像不见了,我简直不敢相信:https://github.com/kriswallsmith/assetic/pull/190

在我们的项目中,为了确保Varnish不会为每次部署缓存新内容,我们手动更改版本,资产会选择该版本。我认为,这是一种常见的做法。但在我们的例子中,它将其保存在web/version-1.2.3/css/all.css这样的文件夹中。

我们对framework部分的配置:

    templating:
        engines: ['twig']
        assets_version: %release_version%
        assets_version_format: "version-%%2$s/%%1$s"

我知道这是一个旧线程,但它位于谷歌的顶端,所以我认为值得更新:

现在,您可以使用缓存阻塞器工作程序使用assetic来完成此操作。但是,2.3.0 assetic捆绑包没有相应的配置,因此您现在需要手动启用它。这可以做到将以下服务定义:

#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 }

此解决方案来自对缓存buster工作程序配置的pull请求:https://github.com/symfony/AsseticBundle/pull/119/files