enb / enb-bem-tmpl-specs

BEM template specs for ENB
Other
15 stars 11 forks source link

Optional deps for engine #63

Closed shuhrat closed 9 years ago

shuhrat commented 9 years ago

In BEM libs all BEMHTML templates depend on i-bem core template, and they are declared in deps file. Tests of those files will pass hence i-bem is attached to the build. In case if you are writing test to the block which has no such deps, tests will fail, because of absent core templates. So you should add to every testing block deps file

mustDeps: [
    { block: 'i-bem', elem: 'html' }
], 

Could you add an option deps to the engines configuration with will attach it to the building deps?

tadatuta commented 9 years ago

actually maintenance of dependencies is not in responsibility of test framework. and moreover each block should be independent and not relay on the fact that there's always some other block with needed deps somewhere in a bundle. so we consider it's good that such tests force developers to write better deps-files.

shuhrat commented 9 years ago

so we have to add into every block that they depend on bem's core templates?

And add this code to every block?

mustDeps: [
    { block: 'i-bem', elem: 'html' }
]
tadatuta commented 9 years ago

yes, as it's really so: all blocks with own templates depend on core templates and cannot work without them.

shuhrat commented 9 years ago

//cc @mishanga

mishanga commented 9 years ago

Дык надо не в депсах это делать, а на уровне технологии сборки.

tadatuta commented 9 years ago

@mishanga почему про этот конкретный элемент этого конкретного блока в этом конкретном фреймворке для тестирования нужно знать про эту особенность этой конкретной технологии, если с формальной точки зрения это просто допущение, что какой-то другой блок скорее всего уже предоставил этот депенд? почему не хотеть писать честные депенды и не городить локальных костылей?

mishanga commented 9 years ago

Потому что это не просто блок и элемент. Это базовые шаблоны, без которых ничего не работает.

qfox commented 9 years ago

@mishanga Т.е. в enb-bemxjst? Предлагается вынести из bem-core?

Guria commented 9 years ago

@zxqfox я бы сказал что не enb-bemxjst, а например enb-bemhtml и enb-bemtree соответственно, по аналогии с enb-bh. См также обсуждения:

qfox commented 9 years ago

@Guria В целом, :+1:

Guria commented 9 years ago

@tadatuta При этом вполне возможно сохранить:

Подход, при котором базовые шаблоны являются именно шаблонами, а не зашиты в библиотеке, позволяет очень гибко влиять на результат — сейчас есть возможность переопределить буквально все. Более того, любой BEMHTML-шаблон — это и есть переопределение базового шаблона.

Я просто не вижу применимости технологий BEMHTML и BEMTREE в отрыве от их базовых шаблонов, т.к. они при этом ничем не отличаются от xjst.

Кроме того текущий подход приводит к тому, что любой блок с bemhtml реализацией, в том числе не реализованный в технологии js, приводит к тому, что по зависимостям тянется весь js фреймворк i-bem.

blond commented 9 years ago

Дык надо не в депсах это делать, а на уровне технологии сборки.

Тогда технология сборки будет неявно зависеть от bem-core.

Потому что это не просто блок и элемент. Это базовые шаблоны, без которых ничего не работает.

Кажется, поэтому не нужно хранить базовые шаблоны как обычный блок =)

На мой взгляд правильнее выносить базовые технологии в отдельные пакеты: bemhtml и bemtree. В этих пакетах нужно явно указывать от каких версий xjst или bem-xjst они зависят. А также дать возможностью переопределить те места, которые неявно зависят от i-bem.js, например, эскейпинг js-аттрибутов.

Guria commented 9 years ago

@andrewblond :+1:

mishanga commented 9 years ago

@andrewblond +1

qfox commented 9 years ago

@andrewblond :+1: :heart:

shuhrat commented 9 years ago

@andrewblond +1

veged commented 9 years ago

@Guria чтобы не тянулся весь фреимворк i-bem.js нужно писать зависимость по технологии { block: 'i-bem', elem: 'html', tech: 'bemhtml' }

qfox commented 9 years ago

@veged А ведь правда можно унести эту штуку в отдельное место, удобнее же будет

narqo commented 9 years ago

Кажется, поэтому не нужно хранить базовые шаблоны как обычный блок =)

Возникает проблема: как донести до пользователя, что для какой-нибудь bem-core@4.0 нужны базовые шаблоны из пакета bh@3.0, если первый это bower-библиотека, а второй — npm-модуль (а с более ранней версией базовых шаблонов, оно физически не может работать правильно).

qfox commented 9 years ago

Возникает проблема: как донести до пользователя, что для какой-нибудь bem-core@4.0 нужны базовые шаблоны из пакета bh@3.0

Решение:

Еще есть вариант пробросить зависимость через сам bem-core (через deps bower, например), тогда для пользователя это будет незаметно, и проблем с синхронизацией не будет (если она вообще будет нужна).

veged commented 9 years ago

@zxqfox к сожалению не всё так однозначно... в текущей архитектуре есть ряд плюсов, а в альтернативной — минусов

qfox commented 9 years ago

@veged Не спорю, но в текущей есть и ряд ограничений. И сложное становится невозможно.

veged commented 9 years ago

@zxqfox что именно сейчас не возможно?

qfox commented 9 years ago

@veged Собственно, в этом issue кое-что описано. Например. нельзя явно описать зависимость от нужной версии базовых bemhtml/bemtree, и, соотв., отстуствуют все вытекающие из этого возможности, в т.ч. и использовать в *-tmpl-* пакетах.

Потому что это не просто блок и элемент. Это базовые шаблоны, без которых ничего не работает.

Вот как-то так ;-)

Вообще, я не очень понимаю проблемы в том, чтобы вынести из bem-core базовые шаблоны bemhtml/bemtree, явно их версионировать, и использовать их же как bower зависимости в bem-core. Но кроме этого еще и публиковать в npm, чтобы была возможность использовать в таких пакетах, как этот.

Guria commented 9 years ago

@veged у icon, image и spin тем не менее прописано просто i-bem. Довод, что врядли кто-то будет подключать bem-components только из-за этих 3 блоков я принял, конечно, но не ясно, что мешает уточнить зависимость.

{ block: 'i-bem', elem: 'html', tech: 'bemhtml' } - это https://github.com/bem/bem-core/blob/v2/common.blocks/i-bem/i-bem.bemhtml ? Просто я не вижу элемента html у блока i-bem. Каким образом происходит соответствие?

Guria commented 9 years ago

Возникает проблема: как донести до пользователя, что для какой-нибудь bem-core@4.0 нужны базовые шаблоны из пакета bh@3.0, если первый это bower-библиотека, а второй — npm-модуль (а с более ранней версией базовых шаблонов, оно физически не может работать правильно).

Так для BH это уже так и сделано. bem-core зависит от пакета технологии для enb, который зависит от пакета с шаблонами bh: https://github.com/bem/bem-core/blob/v2/package.json#L40 https://github.com/enb-bem/enb-bh/blob/master/package.json#L34 https://github.com/bem/bh/blob/master/lib/bh.js

Не понятно, почему же тогда это является проблемой для bemhtml и bemtree. Кроме http://devanswers.ru/a/0h , ничего на ум не приходит. Ну или тогда и bh шаблоны в библиотеку затащить :)

mishanga commented 9 years ago

@Guria { block: 'i-bem', elem: 'html', tech: 'bemhtml' } — это для bem-bl. @veged, видимо, по привычке написал :) Для bem-core то же самое, но без элемента.

veged commented 9 years ago

@zxqfox "нельзя явно описать зависимость от нужной версии базовых bemhtml/bemtree" — это потому, что нужная версия является неотъемлемой частью bem-core (так-же как и, например, нужная версия i-bem.js)

проблема в том, что это увеличит количество компонент, которые нужно релизить (двигать каскадом мажорные версии и т.п.)

а ещё текущее положение позволяет иметь несколько параллельных ответвлений — если выделять в отдельный компонент, то будет проблема вида:

veged commented 9 years ago

@Guria если у icon, image и spin зависимости более широкие, чем им нужно, то это просто баг

veged commented 9 years ago

@Guria в том то и дело, наличие BH с альтернативным подходом как раз обнажает проблемы — согласен, что хорошо бы сделать однообразно, вот только не понятно как лучше (поэтому оно пока как исторически сложилось так и лежит)

tadatuta commented 9 years ago

@veged прямо сейчас ни один из сборщиков не поддерживает depsByTech по-честному :(

текущая схема работы такая: бандловые депсы учитывают технологии из блочных депсов, но модули технологий смотрят в общие «старые» депсы. единственное исключение — это технология клиентского js в bem-tools, в которой захардкоджено, что нужно еще посмотреть в секцию js.bemhtml и сконкатенировать результат компиляции шаблонов на перечисленные там сущности. В ENB же эта задача решается путем создания отдельного бандла с шаблонами и его склейкой (см. https://github.com/bem/project-stub/blob/bem-core/.enb/make.js#L63-L89).

перейти на честную схему в текущем мире — это переписать все модули технологий.

veged commented 9 years ago

@tadatuta не переписать, а поправить баг ;-)

blond commented 9 years ago

Возникает проблема: как донести до пользователя, что для какой-нибудь bem-core@4.0 нужны базовые шаблоны из пакета bh@3.0, если первый это bower-библиотека, а второй — npm-модуль (а с более ранней версией базовых шаблонов, оно физически не может работать правильно).

На самом деле все эти проблемы для BEMHTML существуют сейчас, и существовали всегда, по крайней мере при сборке с помощью ENB. В bem-core нигде явно не сказано какую версию enb-bemxjst нужно использовать при сборке BEMHTML и BEMTREE, при этом в enb-bemxjst явно зашита версия bem-xjst.

Ещё помимо bh такая же проблема актуальна и для stylus и для ym, т.е. почти для всех технологий, которые мы используем.

Получается, что наличие базовых шаблонов в библиотеки нам сильно не помогает. На мой взгляд это удобно для решения другой проблемы: i-bem.js неявно зависит от базовых шаблонов (или наоборот). Если мы что-то меняем в i-bem.js то можем в рамках той же версии просто поменять базовые шаблоны и не мучиться с зависимостями.

Тут мне больше нравится подход bh: возможность определить как и куда записывать данные из моды js во время компиляции.

А может стоит решать эту проблему иначе? Cделать BH и BEMHTML независимым от i-bem.js.

Например, можно отказаться от js моды. Вместо этого явно использовать mix: [{ block: 'i-bem' }] и моду attrs, или сделать моду data, которая будет записывать в data-bem атрибут по аналогии с тем, как это сейчас делается с js мода.

но не ясно, что мешает уточнить зависимость.

@Guria, мешает то, что починив такой «баг» мы сломаем сборку всем пользователям библиотек ;)

Решение: при переходе оставить возможность использовать как из какой-нибудь bem-core@4.0 (с deprecate), так и из bower/npm; в bower/npm синхронизировать версии и при правках строго пушить в оба места (т.е. git push --tags + npm publish); и в следующей мажорной версии (которая случится через год-два, достаточно времени, чтобы донести до каждого) вычистить.

@zxqfox я правильно тебя понял, что ты предлагаешь публиковать инструменты в bower? Я не понимаю как это поможет =)

Я вижу только такой вариант: добавляем мета-информацию о библиотеке, в которой явно говорим, что stylus нужно использовать такой версии, а bemhtml и bh такой. Прямо сейчас пользователи руками могут смотреть в файл с этой мета-информацией и менять зависимости у себя в проекте руками.

проблема в том, что это увеличит количество компонент, которые нужно релизить (двигать каскадом мажорные версии и т.п.)

Для меня это звучит как бонус, а не как проблема =) Потому, что пользователи будут явно видеть, что переход требует мажорных изменений.

bem-bl нуждается в мажорном изменении в своих базовых шаблонах, но не может сделать v2.0 т.к. это уже совсем другая версия, используемая в bem-components

Есть ли в этом реальная необходимость? Более логичным кажется перевести bem-bl на bem-xjst + базовые шаблоны v2.0, выпустив мажорную версию bem-bl, и тогда везде использовать один и тот же BEMHTML.

прямо сейчас ни один из сборщиков не поддерживает depsByTech по-честному :(

Я понимаю о чём ты, но мне не нравится термин «по-честному» :) Сейчас всё работает, но требует от пользователя хорошего понимания depsByTech и много ручной работы для сборки каждой технологии по своим уникальным зависимостям.

не переписать, а поправить баг ;-)

Нет, это не про поправить баг =) У текущих сборщиков есть некая архитектура и интерфейс конфигурации. Исходя из этих двух состовляющих невозможно, чтобы depsByTech работали «сами по себе». А вот чтобы это стало возможным, нужно, даже не переписать все технологии, а написать совершенно новый сборщик с знанием о depsByTech, и уже потом для него заново написать все технологии. Поэтому всё же переписать ;)

qfox commented 9 years ago

я правильно тебя понял, что ты предлагаешь публиковать инструменты в bower? Я не понимаю как это поможет =)

Нет, я предлагал вынести из bem-core базовые шаблоны bemtree/bemhtml. Если они нужны в bower (как и bem-core), то пусть это будет bower. Если нужны в npm — нет проблем набрать npm publish.

в которой явно говорим, что stylus нужно использовать такой версии

peerDeps?

blond commented 9 years ago

@zxqfox, если бы для библиотек было возможно перейти с bower на npm, то это бы решило проблему с неявными зависимостями от технологий и инструментов.

qfox commented 9 years ago

@andrewblond, а ты на какой вопрос ответил? ;-) в bower тоже есть зависимости, и их можно подключать на равне с npm зависимостями. upd в т.ч. и параллельно.

blond commented 9 years ago

@zxqfox, публиковать все инструменты в bower, как-то странно, да и не всегда возможно.

qfox commented 9 years ago

@andrewblond, я не предлагал все публиковать в bower. Я предлагал публиковать xjst→bemtree/bemhtml И в npm, И в bower. В bem-core прописать bower зависимость, в enb-bem-* использовать либо npm пакеты, либо то, что тянется с bem-core — в последнем случае вообще не вижу минусов, только плюсы.

blond commented 9 years ago

@zxqfox, помимо bemhtml есть ещё bh, stylus и ym. Их тогда тоже нужно в bower. А ENB пакеты должны думать откуда брать зависимости, а не через родные для них из npm.

По мне это уже звучит как невозможно =)

qfox commented 9 years ago

@andrewblond тогда публикуй и туда и суда, и бери там где надо откуда надо. ;-) В упор не вижу проблемы, она какая-то искуственная.