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


81

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

Answers:


137

实际上,我最近在基于Symfony 2的有关OroCRM的文章中对此进行了撰写。如果您需要某些上下文/不同命令的原因,您可能会发现它很有趣。

有两种不同的系统可在Symfony应用程序中包含前端文件(javascript,css,图像等)。该assets:install命令首先出现。此命令将在应用程序中搜索所有Symfony捆绑包,以查找

Resources/public

夹。如果找到,该assets:install命令会将文件从复制或符号链接Resources/publicweb/public/bundle/[bundle-name]。这是使用细枝assets功能创建的链接将在其中查找这些文件的地方。这个

<script src="{{ asset('js/script.js') }}" type="text/javascript"></script>

变成这个

<script src="/bundles/[bundle-name]/js/script.js" type="text/javascript"></script>

这就是assets系统要做的全部事情。它使您可以将您的前端文件与分发包一起存储。

assetic系统是不同的。使用assetic,您可以链接到这样的文件。

{% javascripts '@AcmeFooBundle/Resources/public/js/foo.js' %}
    <script type="text/javascript" src="{{ asset_url }}"></script>
{% endjavascripts %}

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

{% javascripts '@AcmeFooBundle/Resources/public/js/*' %}
    <script type="text/javascript" src="{{ asset_url }}"></script>
{% endjavascripts %}

与的另一个不同之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>

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

{% stylesheets 'bundles/acme_foo/css/*' filter='cssrewrite' %}
    <link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}

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

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

<script type="text/javascript" src="/js/as5s31l.js"></script>

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

你需要做什么

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

至于捆绑软件应使用的系统,如果您已阅读以上内容,但不确定assetic可以做什么,请使用assets。你会没事的。


11
这是一个了不起的答案,谢谢。我不认为在Symfony文档中的任何地方都有区别,您的回答可以解决所有问题。
理查德·凯勒2014年

感谢您澄清这一点。您所说的 <script type="text/javascript" src="app_dev.php/js/as5s31l.js"></script> 实际上是什么意思 <script type="text/javascript" src="app.php/js/as5s31l.js"></script>
萨姆·安东尼

@Sam可能-尽管我可能用的是“ /js/as5s31l.js” ---我不记得Symfony生成了什么,也没有可供测试的活动项目。
艾伦·斯托姆

也谢谢您的回答。如果文件是由开发人员前端控制器提供的,这是否意味着不能设置sass过滤器来处理dev env中的scss文件?
斯潘妮

@Stphane我不熟悉您所讨论的特定前端工具链,但是该系统背后的想法是资产可以修改或扩展为包括SCSS处理。
艾伦·斯托姆
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.