如何使 Symfony 2 资产编译以产生不同的文件名?

Posted

技术标签:

【中文标题】如何使 Symfony 2 资产编译以产生不同的文件名?【英文标题】:How to make Symfony 2 asset compilation to product different filenames? 【发布时间】:2012-02-13 05:27:55 【问题描述】:

我按照本文最底部的指南进行操作:http://symfony.com/doc/current/cookbook/assetic/asset_management.html

我有这个代码:

    % javascripts
        ...

        output='js/dist/dist.js'
    %
    <script src=" asset_url "></script>
    % endjavascripts %

现在,如果我运行sf assetic:dump --env=prod,它会正确创建编译文件。但是,我想让它生成一个随机名称(或时间戳),以避免客户端浏览器缓存问题。现在它总是创建被缓存的dist.js 文件,当我更新我的代码时,用户不会看到差异(或得到错误)。

有没有办法让它像dist12345678.js

【问题讨论】:

【参考方案1】:

你有两个选择:要么省略输出文件名(它将是一个自动生成的更改的哈希)或使用资产版本,如 Symfony 文档中所述:http://symfony.com/doc/current/reference/configuration/framework.html#ref-framework-assets-version

【讨论】:

好像没有任何效果。我已清除缓存并运行 assetic:dump --env=prod 并尝试针对 prod 环境,但我没有看到任何 ?v0.0.1 那里。 省略输出文件名不起作用,总是生成与“8662e4b.js”相同的名称。资产版本运行良好。 在倾销资产之前运行php app/console cache:clear --env=prod,正如@faost 提到的那样,工作【参考方案2】:

我一直在为一个项目使用 Assetic 进行大量试验,我偶然发现了一种完全按照您的要求进行操作的方法。如果“输出”字符串包含“*”,则用一个由人类学生成的任意字符串代替它。

例如,我在模板中有以下内容(PHP,我们没有使用 twig):

<?php foreach($view['assetic']->javascripts(array('@MyBundle/Resources/public/js/page.js'), array(), array('output' => 'js/compiled/page_*.js')) as $url): ?>
  <script type="text/javascript" src="<?php echo $view->escape($url) ?>"></script>
<?php endforeach; ?>

<?php foreach($view['assetic']->stylesheets(array('@MyBundle/Resources/public/css/page.css'), array(), array('output' => 'css/compiled/page_*.css')) as $url): ?>
  <link rel="stylesheet" href="<?php echo $view->escape($url) ?>" />
<?php endforeach; ?>

当我运行 app/consoleassetic:dump 时,它会生成 /web/css/compiled/page_8e8fcb3.css 和 /web/js/compiled/page_241b4e5.js。

【讨论】:

我尝试放置一个星号,但它似乎被删除而不是被随机字符串替换。这是 Assetic 的一部分还是你自己做的? 我自己没有做任何事情,我的代码与上面显示的完全一样,除了我的包的名称。将您的 twig 模板编译为 php 是否可能会丢失某些内容?我无法想象为什么会出现这种情况,但我没有想到其他任何事情可以解释为什么我的系统中星号的处理方式与您的系统不同。 可能是不同的版本。你的 Assetic 版本是什么? 抱歉回复晚了 - 我有 Assetic v1.0.3 和 AsseticBundle v1.0.1。 资产输出文件名中的*(星号)被非随机字符串替换(不应用于缓存清除)。见Assetic\Factory\AssetFactory::generateAssetName()。它是确定性的,基于包含的静态文件、过滤器和选项(例如为生成的文件指定的文件名)。 @AmericanUmlaut,你应该更新你的答案。【参考方案3】:

更好的方法是https://github.com/symfony/AsseticBundle/pull/119#issuecomment-28877145

你会得到:

app/console assetic:dump --env=prod --no-debug
Dumping all prod assets.
Debug mode is off.

[file+] /web/assets/static-fe1927d.css
[file+] /web/assets/static-6e92057.js

【讨论】:

以上是关于如何使 Symfony 2 资产编译以产生不同的文件名?的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 2 - 资产 JavaScript 压缩导致错误

如何在 Symfony 2 中进入维护模式以安全地更新生产应用程序?

使用 symfony2 clear cache 命令不刷新静态资产

Symfony2,如何使表单标签类/属性与​​其输入不同?

Symfony 和 Doctrine 使迁移无效

如何以不同的方式格式化不同的文本行,从在 AS3 中创建的文本字段,从 txt 文件填充文本?