Разница между Assetic: dump и assets: install

81

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

Ричард Келлер
источник

Ответы:

138

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

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

Resources/public

папка. Если найден, assets:installкоманда скопирует файлы или создаст символическую ссылку из Resources/publicв web/public/bundle/[bundle-name]. Здесь ссылки, созданные с помощью assetsфункции twig, будут искать эти файлы. Этот

<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, поскольку вы никогда не узнаете, какие из ваших сторонних пакетов используют эти команды. Вам нужно только запустить assetic:dumpперед развертыванием или просмотром приложения в prodрежиме. Порядок не имеет значения.

Что касается системы, которую должен использовать ваш пакет - если вы прочитали выше и не знаете, что asseticможет для вас сделать, используйте assets. Вам будет хорошо.

Алан Сторм
источник
11
Это фантастический ответ, спасибо. Я не верю, что в документации Symfony проводится различие, и ваш ответ проясняет ситуацию.
Ричард Келлер
Спасибо за пояснение. Где вы сказали <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, и у меня нет активного проекта для тестирования.
Алан Сторм,
Спасибо и вам за этот ответ. Если файлы обслуживаются индивидуально через фронт-контроллер dev, означает ли это, что нельзя установить фильтр sass для обработки файлов scss в dev env?
Stphane
@Stphane Я не знаком с конкретной инструментальной цепочкой внешнего интерфейса, о которой вы говорите, но идея, лежащая в основе этой системы, заключается в том, что сборка может быть изменена или расширена для включения обработки SCSS.
Алан Сторм,