使用Assetic在Symfony中禁用资源文件的合并和压缩

4

使用以下配置,即使在开发环境中(我目前使用的环境),我的css和javascript文件也会被压缩和合并。

如何在开发环境中让Assetic既不合并也不压缩这些文件?

app/config/config/yml

assetic:
    debug:          %kernel.debug%
    use_controller: false
    bundles:        [ MyFirstBundle, MySecondBundle, MyThirdBundle ]
    filters:
        cssrewrite: ~
        yui_css:
            jar: %kernel.root_dir%/Resources/java/yuicompressor-2.4.7.jar
        yui_js:
            jar: %kernel.root_dir%/Resources/java/yuicompressor-2.4.7.jar
        less:
            node: %less_node_bin%
            node_paths: [%less_node_modules%]
            apply_to: ".less$"
    assets:
        main_css:
            inputs:
                - %kernel.root_dir%/../web/css/file01.css
                - %kernel.root_dir%/../web/css/file02.css
                - %kernel.root_dir%/../web/css/file03.css
            output: css/main.css
            filter:
                - yui_css
                - less
        other_css:
            inputs:
                - %kernel.root_dir%/../web/css/file04.css
                - %kernel.root_dir%/../web/css/file05.css
                - %kernel.root_dir%/../web/css/file06.css
            output: css/other.css
            filter:
                - yui_css
                - less
        other_js:
            inputs:
                - %kernel.root_dir%/../src/My/FirstBundle/Resources/public/js/file01.js
                - %kernel.root_dir%/../src/My/FirstBundle/Resources/public/js/file02.js
                - %kernel.root_dir%/../src/My/FirstBundle/Resources/public/js/file03.js
            output: js/other.js
            filter:
                - yui_js
        main_js:
            inputs:
                - %kernel.root_dir%/../src/My/FirstBundle/Resources/public/js/file01.js
                - %kernel.root_dir%/../src/My/FirstBundle/Resources/public/js/file02.js
                - %kernel.root_dir%/../src/My/FirstBundle/Resources/public/js/file03.js
            output: js/main.js
            filter:
                - yui_js

app/config/config_dev.yml

assetic:
    debug:          %kernel.debug%
    use_controller: true
    bundles:        [ MyFirstBundle, MySecondBundle, MyThirdBundle ]
    filters:
        cssrewrite: ~
        yui_css:
            jar: %kernel.root_dir%/Resources/java/yuicompressor-2.4.7.jar
        yui_js:
            jar: %kernel.root_dir%/Resources/java/yuicompressor-2.4.7.jar
    assets:

Twig模板:

<head>
    <meta charset="utf-8">
    <title>My title</title>
    {% block stylesheets %}
        <link rel="stylesheet" href="{{ asset('css/main.css') }}">
    {% endblock %}
    {% block javascripts %}
        <script src="{{ asset('js/main.js') }}"></script>
    {% endblock %}
    <!--
    Also tried this type of block, without success:
    {% block javascripts %}
        {% javascripts '@main_js' %}
            <script src="{{ asset_url }}"></script>
        {% endjavascripts %}
    {% endblock %}
    -->
</head>

1
文档中描述了...http://symfony.com/doc/master/cookbook/assetic/yuicompressor.html#disable-minification-in-debug-mode - Aleksander Wons
我阅读了文档,但无法使其正常工作。你能提供一个解决方案吗? - marcv
到目前为止,我尝试的就是您在我的问题中看到的内容。这是我能想到的最好的方法。我不会在这里逐行粘贴我尝试过的数百个更改。我知道“有文档记录”,但这并不能帮助我解决问题。我也知道我做错了什么,这不是一个错误报告... - marcv
3个回答

2

事实上,“config.yml”文件在所有环境中始终使用。例如,在开发环境中,“config.yml”和“config_dev.yml”文件将被合并以形成最终配置。

例如,我们有一个名为config.yml的文件,其内容如下:

foo:
    bar: baz

我们有一个名为config_dev.yml的文件,其内容类似于以下内容:

foo:
    go: run

最终的配置将会有:
foo:
    bar: baz
    go: run

你看到问题了吗?你需要将仅在生产环境中使用的prod特定配置参数(例如您的js压缩器)放置在config_prod.yml文件中,而不是config.yml文件中。
因此,在您的config.yml文件中应该有以下内容:
assetic:
    assets:
        my_js_asset:
            inputs:
                ...

在您的config_prod.yml文件中,类似于以下内容:
assetic:
    assets:
        my_js_asset:
            filters: [yui_js]
            output:  scripts.min.js

编辑1:

然而,这仅修复了缩小(和其他可能的过滤器)问题。

也许我错了,但据我所知,现在不可能分离同一命名资产中定义的各个输入文件。这背后的逻辑在于资源实现相关的twig标签(节点),因为单独的文件本身是生成的,并且可以在dev环境中执行assetic:dump命令后在目标目录中找到(或者如果设置样式表\javascripts twig标签的参数"combine"属性为true)。如果您想检查此内容,并更好地理解实现方式,则可以从以下链接开始:https://github.com/kriswallsmith/assetic/blob/master/src/Assetic/Extension/Twig/AsseticNode.php


我仍然得到了一个合并的文件。改变的是它不再被压缩,而且HTML标签src属性也不同了(例如:/css/49e9dec_part_1.css 用于 @main_css)。如果有帮助的话,这里是我如何应用您的建议的链接:http://pastebin.com/aLtnyLff - marcv
据我所知,当使用所谓的命名资产(在配置文件中明确定义的资产)时,它们将始终被合并(我的意思是,在一个命名资产定义下定义的多个输入将被合并)。使命名资产分开的唯一方法是将每个文件放入单独的命名资产中。 - Artyom Kozhemiakin
这个想法也曾经在我的脑海中浮现过,但只是因为我找不到其他原因。如果我能更加确定“这”就是问题所在(一些文档、文章、源代码等,直到今天我都无法找到...),我会很乐意接受它作为答案的。 - marcv
目前还没有比您的评论更好的答案。您能否在您的回答中编辑这一行(即使用命名资产是不可能的),以便我可以接受它? - marcv

1
  • 你不需要覆盖config_dev.yml中的所有配置,只需要覆盖use_controller选项即可。
  • 在你的模板中,请使用注释掉的那个。当前的将使用转储的资源,因此如果您已经将它们转储为压缩格式,它将始终被使用,它将永远不会使用Assetic控制器。
  • config.yml中,正如文档所说,您应该使用- ?yui_css而不是- yui_css,请注意前导问号(与yui_js相同)。然后这些过滤器将不会在调试模式下使用(在开发环境中)

我刚刚尝试了(再次)您的三个建议并清除了Symfony的缓存,以防万一。我仍然只得到每个命名资源一个压缩资源,只是资源的名称已更改。例如,我的脚本标记的“src”现在是“/js/222fa77_part_1.js”,而不是“/js/main.js”。 - marcv
如果您完全删除配置中的yui_css/yui_js过滤器,会发生什么情况? - Yassine Guedidi
抱歉,当我说“我仍然只得到一个命名资源的缩小版本”时,我指的是“只有一个组合资源”。它确实没有被缩小。如果我完全删除yui_css/yui_js,我会得到相同的结果,即组合但未被缩小。 - marcv

1
我建议将config.yml简化如下:
assetic:
debug:          %kernel.debug%
use_controller: %kernel.debug%
bundles:        [ MyFirstBundle, MySecondBundle, MyThirdBundle ]
filters:
    cssrewrite: ~
    yui_css:
        jar: %kernel.root_dir%/Resources/java/yuicompressor-2.4.7.jar
    yui_js:
        jar: %kernel.root_dir%/Resources/java/yuicompressor-2.4.7.jar
    less:
        node: %less_node_bin%
        node_paths: [%less_node_modules%]
        apply_to: ".less$"

然后,在布局模板中配置CSS和JS文件:
<head>
    <meta charset="utf-8">
    <title>My title</title>

    {% stylesheets 'css/file01.css' 'css/file02.css' 'css/file03.css'
        filter='?yui_css, less' output='css/main.css' %}
        <link rel="stylesheet" href="{{ asset_url }}" />
    {% endstylesheets %}

    {% stylesheets 'css/file04.css' 'css/file05.css' 'css/file06.css'
        filter='?yui_css, less' output='css/other.css' %}
        <link rel="stylesheet" href="{{ asset_url }}" />
    {% endstylesheets %}

    {% javascripts
        '@FirstBundle/Resources/public/js/thirdparty/file01.js'
        '@FirstBundle/Resources/public/js/thirdparty/file02.js'
        '@FirstBundle/Resources/public/js/thirdparty/file03.js'
        filter='?yui_js' output='js/other.js' %}
         <script src="{{ asset_url }}"></script>
    {% endjavascripts %}

    {% javascripts
        '@FirstBundle/Resources/public/js/thirdparty/file04.js'
        '@FirstBundle/Resources/public/js/thirdparty/file05.js'
        '@FirstBundle/Resources/public/js/thirdparty/file06.js'
        filter='?yui_js' output='js/main.js' %}
         <script src="{{ asset_url }}"></script>
    {% endjavascripts %}
</head>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接