Разница между сборкой: дамп и активами: установка

74

В Symfony2, в чем разница между assetic:dump и assets:install? В каких сценариях должна использоваться каждая из этих команд и в каком порядке (если порядок имеет значение)?

Теги:
assetic

1 ответ

121
Лучший ответ

Я на самом деле писал об этом недавно в статье об OroCRM, которая основана на Symfony 2. Если вам нужен какой-то контекст/почему разные команды, вам может показаться интересным.

В приложении Symfony есть две различные системы для включения файлов frontend (javascript, css, images и т.д.). Сначала была команда assets:install. Эта команда будет искать все пакеты Symfony в приложении для

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 позволяет вам ссылаться на файлы в любом комплекте. (@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 позволяет вам это сделать, написав пользовательские фильтры ветки.

Однако это интенсивно работает. В производстве вместо того, чтобы связывать каждый файл отдельно через файл переднего контроллера 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. Вам будет хорошо.

  • 10
    Это фантастический ответ, спасибо. Я не верю, что в документах Symfony проводится различие, и ваш ответ проясняет ситуацию.
  • 0
    Спасибо за разъяснение этого. Где вы указали <script type="text/javascript" src="app_dev.php/js/as5s31l.js"></script> вы действительно имели в виду <script type="text/javascript" src="app.php/js/as5s31l.js"></script>
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню