Gulp/Symfony2:如何避免在缓存破坏时覆盖我的js/css导入?

Gulp/Symfony2:如何避免在缓存破坏时覆盖我的js/css导入?,symfony,caching,twig,gulp,assetic,Symfony,Caching,Twig,Gulp,Assetic,我的Symfony2应用程序有一个快速构建过程,我正在尝试集成缓存破坏,但遇到了一个障碍。我使用gulp rev将哈希附加到连接的javascript文件中,并输出一个清单文件,以在原始文件名和哈希文件名之间进行映射。我目前有一个twig模板,它有一个脚本标记来导入所有正确构建的javascript文件,但我需要找到一种方法来更新该脚本标记,使其指向具有正确哈希的文件版本,确保每次哈希更改时都下载新版本的文件 我已经想到了下面描述的许多解决方案,但没有一个是正确的。有没有人有更好的/正确的解决方

我的Symfony2应用程序有一个快速构建过程,我正在尝试集成缓存破坏,但遇到了一个障碍。我使用
gulp rev
将哈希附加到连接的javascript文件中,并输出一个清单文件,以在原始文件名和哈希文件名之间进行映射。我目前有一个twig模板,它有一个脚本标记来导入所有正确构建的javascript文件,但我需要找到一种方法来更新该脚本标记,使其指向具有正确哈希的文件版本,确保每次哈希更改时都下载新版本的文件

我已经想到了下面描述的许多解决方案,但没有一个是正确的。有没有人有更好的/正确的解决方案,或者有什么理由说明为什么我应该采用我已经想到的方法之一

  • 使用
    gulp revreplace
    my_template.html.twig
    中对
    app.js
    的引用替换为对清单文件中映射定义的
    app-8de7016eef.js
    的引用问题:如果中的命令在我的开发环境中运行,这将覆盖我的实际模板文件,给我留下一个脏git树和不应该提交的更改
  • 让gulp输出一个存储在
    public/html
    中的资产模板文件,该文件未提交到版本控制,并根据是否在prod/dev环境中运行,包含正确的脚本标记(即dev上的
    ,prod上的
    。然后我的主模板可以
    @包括“public/html/assets.html.twig”
    ,并且永远不需要被覆盖。问题:当有多个模板相互扩展,并且在需要覆盖的单独块中同时存在CSS和JS时,这会变得越来越复杂被其他模板覆盖。从我的“吞咽”任务中生成并输出一个细枝文件也会让人感觉很混乱
  • 使用assetic管理缓存破坏:我可以使用
    {%javascripts'public/js/app.js%}{%endjavascripts%},而不是使用
    gulp rev
    assetic的语法,并让它为我处理缓存破坏。问题:使用gulp的全部目的是为了远离assetic,如果我必须同时使用gulp和assetic,那么复杂性就会增加

有人用gulp和symfony解决了缓存破坏问题吗?您是如何做到的?

您应该使用两个配置指令:

framework.templating.assets_version
framework.templating.assets_version_format
您可以在FrameworkBundle的中阅读有关它们的更多信息

它们确实使用常规的
{{asset()}
函数,并且不需要AssetBundle

然后只需转储一个参数/配置文件,将压缩前端源文件文件夹的
md5sum
分配到git预提交钩子中的
assets\u version

.git/hooks/pre-commit

#!/usr/bin/env sh

echo "framework.templating.assets_version: $(tar -cf - ./src/Frontend | md5sum)" \
> app/config/assets_version.yml
app/config/config.yml

# ...
imports:
  # ...
  - { resource: './assets_version.yml' }

谢谢,这非常有效。我们部署过程的一部分将生成assets\u version.yml文件,而不是预提交钩子。然后我简单地使用了
-{resource:'/path/to/assets\u version.yml',ignore\u errors:true}
,这样当assets\u version.yml文件不存在时,配置文件就会工作。