Объединение ресурсов Symfony 5 (управление повторно используемыми пакетными активами)

Я создаю свой собственный пакет для Symfony 5, следуя этой документации: https://symfony.com/doc/current/bundles/best_practices.html

Там сказано:

Пакет также не должен включать сторонние библиотеки, написанные на JavaScript, CSS или любом другом языке.

Он больше не объясняет, как мой пакет может включать ресурсы (js, изображения, CSS, шрифты и т. Д.).

В файле EasyAdmin я вижу, что у него есть собственный webpack.config.js - это то, что я хочу иметь в своем. Как это было достигнуто? Простое размещение webpack.config.js в папке Bundle не позволяет запускать на нем пряжу на бис.

Я видел здесь этот вопрос, который кажется связанным: Может ли пакет Symfony иметь собственную конфигурацию Webpack Encore? Но он не отвечает на мой вопрос - очевидно, что EasyAdmin имеет собственный webpack.config.js в пакете.


person Anastasia Sitnina    schedule 09.08.2020    source источник
comment
Первая часть проста: библиотеки означают что-то вроде jquery или bootstrap и т. Д. Что касается вашего второго вопроса, я никогда не отслеживал это.   -  person Cerad    schedule 09.08.2020


Ответы (1)


Короткий ответ заключается в том, что ваш комплект должен содержать Resources/public/ папку со встроенными производственными ресурсами в ней. Вы можете использовать команду assets:install для копирования или создания символической ссылки на эти файлы в каталог public/ вашего проекта, где он будет автоматически помещен в подкаталог, названный в честь вашего пакета, например, public/bundles/appbundle/. Затем в вашем пакете вы можете предположить, что этот путь существует, и загрузить оттуда ресурсы, например в шаблоне веточки с помощником по ассету: {{ asset('bundles/appbundle/images/my_image.jpg') }}.

Если вы хотите использовать EasyAdminBundle в качестве справки, вот объяснение, как он там работает:

Да, EasyAdminBundle предоставляет webpack.config.js, но он предназначен в основном для разработки и никогда не будет использоваться вашим приложением. Вместо этого конфигурация запишет производственные ресурсы в соответствующие места внутри пакета (а именно src/Resources/public):

Encore
    .setOutputPath('./src/Resources/public/')
    .setManifestKeyPrefix('bundles/easyadmin')

    .enableSourceMaps(false)
    .enableVersioning(false)
    .disableSingleRuntimeChunk()

Эти созданные ресурсы являются частью пакета (см. Ссылку выше) и всегда распространяются вместе с пакетом, поэтому нет необходимости самостоятельно создавать ресурсы внешнего интерфейса при использовании пакета. Эти производственные ресурсы затем могут быть использованы непосредственно вашим приложением, запустив команду Symfony, которая копирует внешние ресурсы в public/-каталог вашего проекта:

php bin/console assets:install

Команда assets: install устанавливает активы пакета в заданный каталог (например, общедоступный каталог).

php bin/console assets:install public

Каталог пакетов будет создан внутри целевого каталога, и каталог Resources / public каждого пакета будет скопирован в него.

Затем в своих шаблонах вы можете полагаться на эти ресурсы с помощью префикса bundle-prefix всякий раз, когда вам требуются эти ресурсы, например для app.css (вы можете увидеть, что это используется в файле layout.html.twig EasyAdminBundle):

{{ asset('bundles/easyadmin/app.css') }}

Если вы хотите сделать что-то подобное, вам, вероятно, придется убедиться, что настройки webpack не нарушают прямой доступ к файлам css, например фрагменты времени выполнения или управление версиями, как это делает EasyAdminBundle. В качестве альтернативы вы можете попросить пользователей вашего пакета также ссылаться на manifest.json в вашем пакете в своей конфигурации ресурсов, но тогда вам, вероятно, придется полагаться на именование пакета, которое может быть не тем, что вам нужно.

person dbrumann    schedule 10.08.2020