Нашел на форуме в одной из тем ссылку на дифф
Не понимаю пока, как осуществляется связь между обычной сборкой и сборкой merged-bundle.
Как я понял, смысл в том, чтоб собрать в одной папке все bemdecl, слить их в один файл и получить общие стили и скрипты. Привожу кусок из документации по процессу сборки
Процесс сборки
1. Какие таргеты необходимо билдить ENB узнаёт из команды enb make [target].
Если вы запустили enb make без указания конкретного таргета,
ENB будет собирать все таргеты, определенные в make.js.
2. ENB инициализирует ноды, участвующие в сборке указанных таргетов.
В это время каждая нода спрашивает у технологий
(которые регистрировались внутри ноды) список таргетов.
3. Запускаются технологии, которые отвечают за те таргеты, которые необходимо билдить.
4. В процессе выполнения технология может потребовать у ноды другие таргеты,
необходимые для сборки (с помощью метода requireSources).
В таком случае технология приостанавливается, нода запускает технологии,
отвечающие за требуемые таргеты (если они не запущены) и после того, как технологии
заканчивают сборку нужных таргетов, продолжает свою работу искомая технология.
5. После того, как технология выполнила свою работу по сборке таргета,
она оповещает об этом ноду (с помощью метода resolveTarget).
6. Сборка завершается после того, как все необходимые таргеты собраны.
В конфиге настраиваются ноды. В модуле '.enb/techs/merged.js' тоже настраивается нода.
...
merged(config, pathToMergedBundle); // в этом модуле исп-ся bemdecl-файлы страниц, но откуда они? Ведь их сборка идет ниже!
...
Не вижу связи между моментом сборки всех страниц (появление bemdecl-файлов) и сборки уже merged-bundle на их основе.
Есть вот такой документ, подробно описывающий схему сборки merged-бандла на ENB: https://github.com/enb/enb-bem-techs/blob/master/docs/build-merged-bundle.md
Отвечает ли он на вопрос?
Нет, т.к. там описывается ситуация, когда уже есть стопка BEMDECL-файлов.
В конфиге ниже идет сборка этой стопки бандлов с поледующей сборкой из них merged. Т.е. мне непонятно именно, как проихсодит переход от сборки "стопки" к сборке merged-бандла.
ENB работает следующим образом: мы в конфиге
.enb/make.js
описываем необходимые нам цели с помощью методаnodeConfig.addTargets()
и технологии сборки, которые умеют эти цели выполнить с помощью методаnodeConfig.addTechs()
.В самом простом случае, если мы хотим получить бандл для технологии
t1
, мы должны сказать что-то типаENB видит, что нужно собрать и среди всех задекларированных технологий находит подходящую.
Но в реальности чаще всего мы хотим получить бандлы технологий, которые нельзя собрать за один шаг: чтобы собрать CSS, на требуется сначала построить декларацию, собрать по ней зависимости, по ним найти нужные файлы и применить к ним какой-нибудь автопрефиксер, а результат прогнать через
borschik
.Если попробовать описать нужный конфиг псевдокодом, получится что-то такое (важно! код не рабочий, просто для объяснения сути процесса):
Примерно так выглядит «типичная» схема сборки. Важный момент, который нужно понимать — это то, что у большинства технологий есть значения по умолчанию для полей
source
иtarget
, поэтому из конфига не всегда очевидно, что из чего собирается. Но с этим очень легко разобраться, если запуститьenb server
и открыть в браузере страницуhttp://localhost:8080/
— здесь ENB нарисует граф сборки, там все связи будут очевидны.Теперь, собственно, к тому, как в эту картину вписывается
merged
-бандл. По сути он добавляет к вышеописанной схеме всего лишь следующее: «Собери мнеmerged.bemdecl.js
на основе всех имеющихся в проекте?.bemdecl.js
». А дальше ENB автоматически понимает, что для сборки каждого?.bemdecl.js
потребуется соответствующий?.bemjson.js
, а тот в свою очередь можно получить, если воспользоваться технологийfile-provider
. Но оба эти шага у нас были заранее описаны для той самой «типичной сборки», поэтому ничего, кроме запроса на смердженный bemdecl в конфиг и добавлять-то не нужно.Спасибо Что меня смущает, так это то, что в конфиге фактически дважды идёт настройка нод, т.е.
Получается, что результат из той "конфигурации", что ниже, используется в той, что выше, а затем возвращается снова в нижнюю, т.к. nodeConfig.addTargets только в нижней задан.
Это, вероятно, возможно за счёт того, что у них общий nodeConfig?
Смысл в том, что все декларации из
config.nodes('*.bundles/*', function(nodeConfig) { ... });
применятся ко всем имеющимся бандлам (т.к. используется*
), а вmerged.js
описаны дополнительные действия именно для конкретного merged-бандла — там путь к нему указывается явно.