В продолжение https://github.com/bem/bem-core/pull/622/files
@tadatuta: сборка бандла технологии инвалидируется по суффиксам, от которых она зависит.
@tadatuta: в данном случае есть «обычная» зависимость от js и browser.js — изменение блоков в этих технологиях инвалидирует сборку бандла. плюс по depsByTech есть зависимость от bemhtml. и изменение блоков в технологии bemhtml сейчас пересборку не вызывает, поэтому приходится передавать force явно.
@zxqfox: очень часто слова хак и depsByTech встречаются рядом.
@tadatuta: так и есть. полноценную реализацию, которую начали делать в рамках bem-tools@v1 так и не довели до конца :(
@veged: дело не столько в depsByTech сколько в сшивании двух технологий в один файл и инвалидации кешей
@zxqfox: Честно говоря, проблема здесь не в бэме или технологиях, а в его конкретной реализации/оптимизациях.
@zxqfox: Насколько я помню, там сейчас есть небезбажный монолит APW. Это он о протухшем кеше не знает?
@veged: APW это абстрактная очень штука, она сама по себе ни о чём таком не может ни знать ни не знать — но да, это уже оффтопик
Хочется понять, что надо сделать, чтобы этой проблемы не было.
На мой взгляд вариантов два:
- Добить полноценную реализацию — для этого нужна её формализация
- Перевести на enb и добить её там — для этого нужен адепт по enb, и опять же формализация
У кого-то еще есть желание что-то с этим сделать?
нужно всё нормально запрограммировать ;-) можно сделать это в bem-tools, вот только у нас рук нет :-(
Нормально запрограммировать это как кнопка «сделать отличное нечто».
В свое время с архитектурой бем-тулзов я разбирался с неделю, и это были только поверхностные изыскания. В enb даж не знаю стоит ли лезть. Хотелось бы понять что конкретно делать-то надо. Обсуждалось же не раз, если я правильно понял. Может где-то что-то есть что почитать как это предполагалось сделать.
Есть еще такой момент, что часть людей переехало на enb, и с разработкой самих тулзов непонятки. Вот и непонятно теперь куда движемся.
не переживай, ничего особо конкретного не наобсуждалось ;-)
@veged Окей, тогда у меня вопрос по сборщику, никто еще не начал?
@zxqfox
bem-tools
в базовом модуле технологий, от которого наследуются все остальные модули для сборки технологий блоков, реализован метод validate. Он на вход принимает путь до собираемого файла и список файлов, от которых он зависит. Дальше список зависимостей сравнивается со списком, закешированным после предыдущей сборки. Зоветсяvalidate()
изgetBuildResults()
, где список зависимостей собирается на основеgetBuildSuffixes()
. В текущей реальности можно более-менее легко (наверное) закостылять, чтобы сборкаbrowser.js+bemhtml
зависила не только от суффиксовjs
иbrowser.js
, как это сделано сейчас, но и отbemhtml
. Но это в любом случае будет вызывать инвалидацию при изменении любого блока в технологииbemhtml
, а не только от тех, от которых зависитbrowser.js
по depsByTech. Если совсем костылями-костылями кастомно для каждой технологии отдельно, то можно список файлов-зависимостей фильровать руками.browser.js
). б) собрать отдельныйbemdecl.js
на основе нужного поля в depsByTech (для нас этоbemhtml
). в) собрать на основе этогоbemdecl.js
нужную технологию как если бы это была обычная сборка бандла и положить на файловую систему. г) сконкатенировать результаты а) и в) Кажется, что если над этим навернуть какой-нибудь хелпер, то с этим даже можно как-то жить. По крайней мере инвалидация там (вроде) работает как нужно.@tadatuta Ой... Спасибо за подробности. Весьма кстати ;-)
@veged @tadatuta Выложу свои мысли.
fs
, которая будет уметь читать бем-структуры и следить за инвалидацией в памяти, уметь сохранять на диск, если надо.@zxqfox, сейчас активную разработку на ENB ведет @andrewblond. его стараниями появилась целая куча модулей: https://github.com/enb-bem так что задавай вопросы, форум он читает. ну и более хардкорные варианты тоже можно обсуждать с ним — он сейчас самый погруженный в контекст сборки участник команды.
@tadatuta я наверное не туда пишу, но пока везде молчит ;-)
В общем, у меня такое ощущение, что:
.on('something-processed')
;('processor', '.dest', ['tech1', 'tech2', 'tech3'])
, например,('html-from-bemjson', '.html', ['.bemjson', '.bemhtml'])
. Аналогично можно будет рядом описать'.html', ['.bemjson', '.bh']
и сборка.html
будет происходит из имеющихся технологий в блоках, без требования конкретныхbh/bemhtml/anythingelse
;Насколько я понимаю, енб-технологии от предполагаемых процессоров и тасков отличаются именно тем, что технологии, как бесспорно неплохое решение, решают немного другую задачу — они запускаются последовательно и делают что-то, теряется связь и тонкая настройка самого важного — бем-знаний об объектах. Я предлагаю его вынести за скобку в хранилище, или еще куда-то.
Кроме того, при сборке некоторого таргета мы явно это указываем, либо ждем, что соберутся все возможные таргеты, описанные в конфигах для бандла. Поэтому лучше это делать от самого таргета, запуская только нужное, а не последовательно запуская все, но собирая и пропуская ненужное. Отсуда и часто прослеживаемая аналогия с
gulp
.Некий дирижер будет получать на вход таргеты, загружать метаинформацию о проекте (конфиги), читать кеш или директории, обновляя измененные части при необходимости (инициализация хранилища), и дальше шаг за шагом звать на сборку нужен таргеты, которые будут дергаться из хранилища, либо с диска (если в хранилище их нет), и при резолве всех зависимых возвращать назад. Пока не вижу в таком подходе проблем с инвалидацией кеша или медленным стартом.
итого, примерный конфиг будет похож на
.enb/make.js
, но должен будет разделить techs на processors/converters и tasks/commands. processors — преобразуют входные данные в нечто еще, tasks — выполняют служебные задачи, не относящиеся напрямую к bem-предметной области, в т.ч. копирование файлов.В такой схеме deps вполе легко вклинивается и используется дирижером, как task, или даже без напрямую. Равно как и levels.
p.s. Возможно, это похоже на небольшой рефакторинг enb.
/cc @andrewblond
Обсуждение разрослось далеко за рамки
depsByTech
, и как мне кажется, это неудобно. Предлагаю выделить проблемы и предложения отдельными постами из того, что уже написано.Что касается реализации
depsByTech
, то она конечно же хромает. По крайней мере в ENB API получения деклараций по технологии выглядит очень неочивидным. Основная причина тому — инвалидация кэша.В ENB все технологии (кроме базовых) работают на
?.files
/?.dirs
таргете. Чтобы с точки зрения использования всё выглядело красиво, нужно раскрыватьbemdecl
в несколькоdeps
по технологиям, а потом сформировать?.files
таргет так, чтобы инстанс внутри него отдавал для каждой технологии свой набор файлов. Это всё так или иначе реализуемо, но если мы поменяем одну tech-зависимость у одного блока, то?.files
таргет инвалидируется полностью, и пересоберутся таргеты всех технологий, а не той, которую мы меняли.Сейчас это всё можно сделать руками:
bemdecl
->deps
->files
->bemdecl-from-deps-by-tech
->deps
->files
. Тогда каждый такой?.files
таргет будет правильно закэширован, но только указывать его нужно будет опять же руками для каждой технологии свой.если вы хотите задать вопрос команде, то ставьте еще и метку asktheteam ;) спасибо!