【发布时间】:2014-05-17 09:05:44
【问题描述】:
在 Symfony2 中,assetic:dump 和 assets:install 有什么区别?这些命令应在哪些场景下使用,以及以什么顺序(如果顺序相关)?
【问题讨论】:
在 Symfony2 中,assetic:dump 和 assets:install 有什么区别?这些命令应在哪些场景下使用,以及以什么顺序(如果顺序相关)?
【问题讨论】:
实际上,我在一篇关于 OroCRM 的文章中wrote about this recently,该文章基于 Symfony 2。如果您想要了解不同命令的一些上下文/原因,您可能会发现它很有趣。
在 Symfony 应用程序中包含前端文件(javascript、css、图像等)有两种不同的系统。 assets:install 命令首先出现。该命令将搜索应用程序中的所有 Symfony Bundle 以查找
Resources/public
文件夹。如果找到,assets:install 命令会将文件从Resources/public 复制或符号链接到web/public/bundle/[bundle-name]。这是使用 twig 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 允许您链接到 any 包中的文件。 (@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>
也就是说,对这些文件的请求将通过 PHP 前端控制器 (app_dev.php) 通过 assetic 包中的特殊路由设置运行。这意味着,当您处于dev 模式时,您永远不需要转储资产。它们会自动包含在内。它还允许您对文件应用过滤器。例如,以下将cssrewrite 过滤器应用于拉入的文件。
{% stylesheets 'bundles/acme_foo/css/*' filter='cssrewrite' %}
<link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}
如果您想以编程方式更改前端资产的输出,assetic 可让您通过编写自定义 twig 过滤器来实现。
但是,这是性能密集型的。在生产中,不是通过 PHP 前端控制器文件单独链接每个文件,生成的 HTML 将如下所示
<script type="text/javascript" src="/js/as5s31l.js"></script>
as5s31l.js 来自哪里?这就是assetic:dump 命令的作用。它合并所有单独的 javascript/css 文件(在应用过滤器之后)并创建一个漂亮的、静态的、可缓存的文件用于生产。
除非项目特别告诉您,否则您应该始终运行 assets:install 和 assetic:dump,因为您永远不会知道您的哪些第三方捆绑包使用这些命令。在prod模式下部署或查看应用程序之前,只需要运行assetic:dump。顺序无关紧要。
至于您的捆绑包应该使用哪个系统 - 如果您已阅读上述内容并且不确定 assetic 可以为您做什么,请使用 assets。你会没事的。
【讨论】:
<script type="text/javascript" src="app_dev.php/js/as5s31l.js"></script> 你真的是说<script type="text/javascript" src="app.php/js/as5s31l.js"></script>