资产:转储和资产之间的区别:安装

Ric*_*ler 80 symfony assetic

在Symfony2中,assetic:dump和之间有什么区别assets:install?在什么情况下应该使用这些命令中的每一个,以及以什么顺序(如果顺序相关)?

Ala*_*orm 135

最近在一篇关于OroCRM的文章中写到了这一点,它基于Symfony 2.如果你想要一些上下文/为什么不同的命令,你可能会发现它很有趣.

在Symfony应用程序中有两种不同的系统用于包含前端文件(javascript,css,images等).该assets:install命令首先出现.此命令将搜索应用程序中的所有Symfony Bundles

Resources/public
Run Code Online (Sandbox Code Playgroud)

夹.如果找到了,assets:install命令将复制或符号链接文件Resources/publicweb/public/bundle/[bundle-name].这是使用twig assets函数创建的链接将查找这些文件的位置.这个

<script src="{{ asset('js/script.js') }}" type="text/javascript"></script>
Run Code Online (Sandbox Code Playgroud)

变成了这个

<script src="/bundles/[bundle-name]/js/script.js" type="text/javascript"></script>
Run Code Online (Sandbox Code Playgroud)

这就是assets系统所做的一切.它允许您使用捆绑包存储前端文件.

assetic系统是不同的.有了assetic,你链接到这样的文件.

{% javascripts '@AcmeFooBundle/Resources/public/js/foo.js' %}
    <script type="text/javascript" src="{{ asset_url }}"></script>
{% endjavascripts %}
Run Code Online (Sandbox Code Playgroud)

样式表和图像有类似的标签.请注意,assetic允许您链接到任何包中的文件.(@AcmeFooBundle).Assetic还允许您使用通配符链接到文件夹中的多个文件.

{% javascripts '@AcmeFooBundle/Resources/public/js/*' %}
    <script type="text/javascript" src="{{ asset_url }}"></script>
{% endjavascripts %}
Run Code Online (Sandbox Code Playgroud)

另一个区别assetic在于生成的链接.在dev环境中他们会看起来像这样.

<script type="text/javascript" src="/app_dev.php/js/foo.js"></script>
<script type="text/javascript" src="/app_dev.php/js/bar.js"></script>
Run Code Online (Sandbox Code Playgroud)

也就是说,对这些文件的请求将通过捆绑app_dev.php中的特殊路由设置来运行PHP前端控制器()assetic.这意味着,当您处于dev模式时,您永远不需要转储资产.它们是自动包含的.它还允许您将过滤器应用于文件.例如,以下内容将cssrewrite过滤器应用于所引入的文件.

{% stylesheets 'bundles/acme_foo/css/*' filter='cssrewrite' %}
    <link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}
Run Code Online (Sandbox Code Playgroud)

如果您曾想以编程方式更改前端资产的输出 -  assetic可以通过编写自定义树枝过滤器来实现.

但是,这是性能密集型的.在生产中,生成的HTML不是通过PHP前端控制器文件单独链接每个文件,而是如下所示

<script type="text/javascript" src="/js/as5s31l.js"></script>
Run Code Online (Sandbox Code Playgroud)

哪里as5s31l.js来的?这就是assetic:dump命令的作用.它结合了所有单独的javascript/css文件(在应用过滤器之后)并为生产创建了一个漂亮的,可静态的,可缓存的文件.

你需要做什么

除非明确项目告诉你,否则你应该始终运行assets:installassetic:dump,因为你永远不会知道,你的第三方捆绑使用这些命令.您只需assetic:dump在以prod模式部署或查看应用程序之前运行.订单无关紧要.

至于你的捆绑应该使用哪个系统 - 如果你已经阅读了上述内容并且你不确定assetic可以为你做什么,请使用assets.你会没事的.

  • 这是一个很棒的答案,谢谢.我不相信在Symfony文档中的任何地方都会有所区别,你的答案会清除. (11认同)