Войти с помощью github

Добре коллеги!

Случайно выяснил, что борщик минимизирует css как-то не очень хорошо.

Работаю с enb-borshchik

Дело в том, что он не производит семантическое объединение классов. Которое просто необходимо для тех случаев когда хотим использовать base64 в css.

Что же это такое семантическое объединение?

Рассмотрим пример:

Есть файл a.css

.a {
    left: 20px;
    background: #red;
}

.b {
    left: 1px;
}

.k .a {
    left: 20px;
    background: #red;
}

.a {
    right: 20px;
    left: 1px;
    background: url(./resources/images/1280x720-tv-background__overlay_info.png);
}

.b {
    left: 2px;
}

.k .a {
    right: 20px;
    left: 1px;
    background: url(./resources/images/1280x720-tv-background__overlay_info.png);
}

После семантического объединения должны получить следующее:

.a, .k .a{
    right:20px;
    left:1px;
    background:url(resources/images/1280x720-tv-background__overlay_info.png)
}
.b { left:2px }

Делать это умеет библиотека: https://www.npmjs.com/package/clean-css

с включенной опцией --semantic-merging

Вопрос - как решить задачу семантической сборки css для enb?

Видел, что есть NPM version

Может уже решали данную проблему до меня?

Здравствуйте! Возникла проблема со сборкой css/js в отдельную папку проекта (в папке проекта со стилями не должны лежать .decl.js и пр. Структура проекта следующая desktop.bundles/[название сайта]/[layouts]/[one-column]/one-column.bemjson Т.е. может быть несколько сайтов, которых лежат папки layouts, templates, modules, в которых лежат ноды, которые необходимо собрать. Собирается html сейчас в liquid/[название сайта]/[layout]/[one-column].html Файлы css/js, изображения и т.п. должны собираться liquid/[название сайта]/files/ Делал все аналогично мануалу по сборке merged-бандла, но со сборкой bemdecl.js, из которых потом собирается css, возникли проблемы, так как их нужно мерджить несколько раз. Мой кривой и некрасивый Make.js на GitHub (пожалуйста не ругайтесь, пытаюсь настроить сборщик первый раз :) )

Коллеги, наверняка уже сталкивались с задачей по созданию отдельных тем. Скажите как решали?

В моей ситуации необходимо обязательно темы делать отдельными css файлами.

Здравствуйте! Есть проблема с подключением библиотек. Если конкретно bem-grid. Насколько я понял из руководств чтобы подключить библиотеку необходимо выполнить следующее:

  1. Прописать библиотеку в bower.json
  2. bower-npm-install для установки и подтягивания всех зависимостей
  3. Прописать уровень в make.js сборщика { path: 'libs/bem-grid/common.blocks', check: false }
  4. Запустить сервер

В результате стили не подтягиваются. Подскажите пожалуйста что я упустил. Пользуюсь enb. И еще один вопрос. Как можно подключить библиотеку на enb, если весь проект на bem-tools?

Стоит задача - обернуть вендорный js в ymodules.

При этом, это должно быть технологией. Т.к. вендорный JS используется не только для самого приложения, но и в тестах. В общем применение банальной нотации борщика в исходнике не подходит - нужен промежуточное состояние.

Нужно из ?.vendor.js превратить в ?.js.

Внутри ?.vendor.js

Будет что-то типа такого:

(function(name, ctx, define) {
    var module = define.call(ctx, ctx);
    typeof modules === 'object'?
        modules.define(name, function(provide) { provide(module); }) :
        (ctx[name] = module);
}('backbone', this, function(global) {
    /*vendorof:../../../libs/backbone/backbone.js*/;
    return global.Backbone;
}));

modules.define('backbone', function (provide, Backbone) {
    'use strict';

    Backbone.prototype.someMethod = replaceMethod;
    provide(Backbone.noConflict());
});

Все текущие примеры собирают код в конечный продукт. Мне же нужен промежуточный ?.js который будет содержать в себе код вендора.

А уже потом собираться с остальным js.

https://github.com/enb-bem/enb-magic-platform

Верно ли понимаю, что это таск менеджер?

И можно с помощью него запускать сборки разных mode одной командой enb?

Всем привет. Собираю БЭМ-проект по описанию zxqfox https://ru.bem.info/forum/175/ Далее запускаю сервер с помощью ENB: Проверяю результат по ссылке http://lookingschools.com:8080/desktop.bundles/index/index.html Открывается страница с примерами блоков библиотеки. Только вот селекты какие-то кривые. При нажатии страница мерцает. Подскажите, что не так и где править? Если делаю так: git clone https://github.com/bem/project-stub.git --depth 1 --branch v1.0.0 start-project cd start-project npm install , то все отрабатывает отлично. Но так как у меня php проект, пользуюсь описанием zxqfox.

Есть ли в enb server возможность использовать его не только для отдачи собранной статики, но и как api сервер? Хочется параллельно разрабатывать js и тестировать с api

Вопрос от @lehakos: Скажите, пожалуйста, а как можно использовать jade вместо json формата для БЭМ? Есть ли такая практика вообще? :) И еще вопрос, хотелось бы использовать плагины Gulp вроде минификатора изображений, генератора спрайтов, livereload и т.д. Возможно ли это совместить с БЭМ сборщиком проекта?

Всем привет!

Очень интересную ситуацию наблюдаю при сборке примеров для документации на разных платформах (Windows, Linux/OS X) с использованием пакетов enb-bem-examples и enb-magic-factory. На Windows сборка проходит без ошибок на остальных возникает следующая ошибка:

  ~/src/drom-bem-makeup   master ●  enb make examples -n
16:14:26.665 - build started
16:14:27.446 - [failed] [blocks.examples/common-desktop/common-desktop.bemjson.js] file-provider
16:14:27.448 - [failed] [blocks.examples/common-mobile/common-mobile.bemjson.js] file-provider
16:14:27.448 - [rebuild] [blocks.examples/b-button/ee3ZC6dyTetTRFqbHHZqKvywwXM/ee3ZC6dyTetTRFqbHHZqKvywwXM.bemjson.js] file-provider
16:14:27.448 - [rebuild] [blocks.examples/b-button/wrlcu38vmkNaP3tb9gvwZXBiszI/wrlcu38vmkNaP3tb9gvwZXBiszI.bemjson.js] file-provider
16:14:27.448 - [rebuild] [blocks.examples/b-button/PNXYUr__M6VSB4YxqCmkdMhk2l0/PNXYUr__M6VSB4YxqCmkdMhk2l0.bemjson.js] file-provider
16:14:27.449 - [rebuild] [blocks.examples/b-button/Ekw9TzRLS_fyQiOkC-Zi804eDzo/Ekw9TzRLS_fyQiOkC-Zi804eDzo.bemjson.js] file-provider
16:14:27.449 - [rebuild] [blocks.examples/b-button/9y8JjzeQPxlsleieuSrVga8xv4U/9y8JjzeQPxlsleieuSrVga8xv4U.bemjson.js] file-provider
16:14:27.449 - [rebuild] [blocks.examples/b-button/WgU-OFa8iJsKWLBtnoxXtfgoLCc/WgU-OFa8iJsKWLBtnoxXtfgoLCc.bemjson.js] file-provider
16:14:27.449 - [rebuild] [blocks.examples/b-link/D1rJB4_MGVvbnFlNUN1xUlQvtpQ/D1rJB4_MGVvbnFlNUN1xUlQvtpQ.bemjson.js] file-provider
16:14:27.449 - [rebuild] [blocks.examples/b-link/6O-IryxuQJM1YwYJYT_hHvf20NQ/6O-IryxuQJM1YwYJYT_hHvf20NQ.bemjson.js] file-provider
16:14:27.449 - [rebuild] [blocks.examples/b-button/kreyF1JOyT4hpa2NBRIP_KwvWkY/kreyF1JOyT4hpa2NBRIP_KwvWkY.bemjson.js] file-provider
16:14:27.449 - [rebuild] [blocks.examples/b-link/7PpftPzRoUzxzKCcgS8Xn51w1o/7PpftPzRoUzxzKCcgS8Xn51w1o.bemjson.js] file-provider
16:14:27.450 - [rebuild] [blocks.examples/b-link/28tLGFFUSZMApDlzg9Hi-09cNzg/28tLGFFUSZMApDlzg9Hi-09cNzg.bemjson.js] file-provider
16:14:27.450 - [rebuild] [blocks.examples/b-link/XCMcnEyp-kgOzxTPExe9Xyu6xUI/XCMcnEyp-kgOzxTPExe9Xyu6xUI.bemjson.js] file-provider
16:14:27.450 - [rebuild] [blocks.examples/b-link/uIFN2UGU4DNbCgT2JACquwcCSUo/uIFN2UGU4DNbCgT2JACquwcCSUo.bemjson.js] file-provider
16:14:27.450 - [rebuild] [blocks.examples/b-link/UgeVMmhNha9pAtahV7VjriQCt9I/UgeVMmhNha9pAtahV7VjriQCt9I.bemjson.js] file-provider
16:14:27.450 - [rebuild] [blocks.examples/b-link/xhSZr6XvNYk0AwDEfeLBCjtMs1g/xhSZr6XvNYk0AwDEfeLBCjtMs1g.bemjson.js] file-provider
16:14:27.450 - [rebuild] [blocks.examples/b-button/g7f-wx_WjkFq_MRA_Fzs9eRLCnQ/g7f-wx_WjkFq_MRA_Fzs9eRLCnQ.bemjson.js] file-provider
16:14:27.450 - [rebuild] [blocks.examples/m-button-ico/cUvu2JGXCO5KN8cmKNt11ZL40nI/cUvu2JGXCO5KN8cmKNt11ZL40nI.bemjson.js] file-provider
16:14:27.450 - [rebuild] [blocks.examples/b-link/xIo7WqepN6yOXUzXkxpVCwoPtLw/xIo7WqepN6yOXUzXkxpVCwoPtLw.bemjson.js] file-provider
16:14:27.450 - [rebuild] [blocks.examples/b-link/QD3PyE2oaSabCQ_mcdAbZliSAME/QD3PyE2oaSabCQ_mcdAbZliSAME.bemjson.js] file-provider
16:14:27.586 - [rebuild] [blocks.examples/common-desktop/common-desktop.levels] levels
16:14:27.586 - [rebuild] [blocks.examples/common-mobile/common-mobile.levels] levels
16:14:27.587 - [rebuild] [blocks.examples/b-button/ee3ZC6dyTetTRFqbHHZqKvywwXM/ee3ZC6dyTetTRFqbHHZqKvywwXM.levels] levels
16:14:27.587 - [rebuild] [blocks.examples/b-button/wrlcu38vmkNaP3tb9gvwZXBiszI/wrlcu38vmkNaP3tb9gvwZXBiszI.levels] levels
16:14:27.587 - [rebuild] [blocks.examples/b-button/PNXYUr__M6VSB4YxqCmkdMhk2l0/PNXYUr__M6VSB4YxqCmkdMhk2l0.levels] levels
16:14:27.587 - [rebuild] [blocks.examples/b-button/Ekw9TzRLS_fyQiOkC-Zi804eDzo/Ekw9TzRLS_fyQiOkC-Zi804eDzo.levels] levels
16:14:27.587 - [rebuild] [blocks.examples/b-button/9y8JjzeQPxlsleieuSrVga8xv4U/9y8JjzeQPxlsleieuSrVga8xv4U.levels] levels
16:14:27.587 - [rebuild] [blocks.examples/b-button/WgU-OFa8iJsKWLBtnoxXtfgoLCc/WgU-OFa8iJsKWLBtnoxXtfgoLCc.levels] levels
16:14:27.587 - [rebuild] [blocks.examples/b-link/D1rJB4_MGVvbnFlNUN1xUlQvtpQ/D1rJB4_MGVvbnFlNUN1xUlQvtpQ.levels] levels
16:14:27.587 - [rebuild] [blocks.examples/b-link/6O-IryxuQJM1YwYJYT_hHvf20NQ/6O-IryxuQJM1YwYJYT_hHvf20NQ.levels] levels
16:14:27.587 - [rebuild] [blocks.examples/b-button/kreyF1JOyT4hpa2NBRIP_KwvWkY/kreyF1JOyT4hpa2NBRIP_KwvWkY.levels] levels
16:14:27.587 - [rebuild] [blocks.examples/b-link/7PpftPzRoUzxzKCcgS8Xn51w1o/7PpftPzRoUzxzKCcgS8Xn51w1o.levels] levels
16:14:27.588 - [rebuild] [blocks.examples/b-link/28tLGFFUSZMApDlzg9Hi-09cNzg/28tLGFFUSZMApDlzg9Hi-09cNzg.levels] levels
16:14:27.588 - [rebuild] [blocks.examples/b-link/XCMcnEyp-kgOzxTPExe9Xyu6xUI/XCMcnEyp-kgOzxTPExe9Xyu6xUI.levels] levels
16:14:27.588 - [rebuild] [blocks.examples/b-link/uIFN2UGU4DNbCgT2JACquwcCSUo/uIFN2UGU4DNbCgT2JACquwcCSUo.levels] levels
16:14:27.588 - [rebuild] [blocks.examples/b-link/UgeVMmhNha9pAtahV7VjriQCt9I/UgeVMmhNha9pAtahV7VjriQCt9I.levels] levels
16:14:27.588 - [rebuild] [blocks.examples/b-link/xhSZr6XvNYk0AwDEfeLBCjtMs1g/xhSZr6XvNYk0AwDEfeLBCjtMs1g.levels] levels
16:14:27.588 - [rebuild] [blocks.examples/b-button/g7f-wx_WjkFq_MRA_Fzs9eRLCnQ/g7f-wx_WjkFq_MRA_Fzs9eRLCnQ.levels] levels
16:14:27.588 - [rebuild] [blocks.examples/m-button-ico/cUvu2JGXCO5KN8cmKNt11ZL40nI/cUvu2JGXCO5KN8cmKNt11ZL40nI.levels] levels
16:14:27.589 - [rebuild] [blocks.examples/b-link/xIo7WqepN6yOXUzXkxpVCwoPtLw/xIo7WqepN6yOXUzXkxpVCwoPtLw.levels] levels
16:14:27.589 - [rebuild] [blocks.examples/b-link/QD3PyE2oaSabCQ_mcdAbZliSAME/QD3PyE2oaSabCQ_mcdAbZliSAME.levels] levels
16:14:27.590 - build failed
16:14:27.597 - build failed
Error: File not found: /Users/rudoy/src/drom-bem-makeup/blocks.examples/common-desktop/common-desktop.bemjson.js
    at /usr/local/lib/node_modules/enb-bem-examples/node_modules/enb/techs/file-provider.js:47:49
    at FSReqWrap.cb [as oncomplete] (fs.js:212:19)

Кусок кода отвечающий за сборку примеров и их бандлов:

var factory = config.module('enb-magic-factory'),
        helper = factory.getHelper('examples');

    helper.prebuild(function(magicConfig){
        magicConfig.registerNode('blocks.examples/common-desktop');
        magicConfig.registerNode('blocks.examples/common-mobile');
    });

    helper.configure(function(config, nodes, targets){
        var nodes = nodes;
        config.nodes(nodes, function(nodeConfig){
            if(nodeConfig.getPath() === appConfig.examplesDir + '/common-desktop' || nodeConfig.getPath() === appConfig.examplesDir + '/common-mobile'){
                var depsDesktop = [],
                    depsMobile = [];

                nodeConfig.addTechs([
                    [ require('enb-bem-techs/techs/levels'), {levels: getExamplesLevels(config)} ],
                    [ enbBemTechs.files ],
                    [ techs.js ]
                ]);

                nodes.forEach(function (node) {
                    if (!/\/.*common.*/.test(node)) {
                        var pathNorm = path.normalize(node),
                            splitedPath = pathNorm.split(path.sep);

                        if(/m\-.\w*/.test(node)){
                            depsMobile.push(splitedPath[splitedPath.length - 1] + '.deps.js');
                            nodeConfig.addTechs([
                                //copy deps files to common-mobile dir
                                [ enbBemTechs.provideDeps, { node: pathNorm,  target: splitedPath[splitedPath.length - 1] + '.deps.js' } ],
                            ]);
                        }else{
                            depsDesktop.push(splitedPath[splitedPath.length - 1] + '.deps.js');
                            nodeConfig.addTechs([
                                //copy deps files to common-desktop dir
                                [ enbBemTechs.provideDeps, { node: pathNorm,  target: splitedPath[splitedPath.length - 1] + '.deps.js' } ],
                            ]);
                        }

                    }
                });

                //merge bundle
                if(nodeConfig.getPath() === appConfig.examplesDir + '/common-mobile'){
                    nodeConfig.addTechs([
                        [ enbBemTechs.mergeDeps, { sources:  depsMobile }]
                    ])
                }
                if(nodeConfig.getPath() === appConfig.examplesDir + '/common-desktop'){
                    nodeConfig.addTechs([
                        [ enbBemTechs.mergeDeps, { sources:  depsDesktop }]
                    ])
                }

                nodeConfig.addTechs([
                    //bemhtml
                    [ techs.bemhtml, { sourceSuffixes: [ 'bemhtml', 'bemhtml.js' ] } ],
                    //css
                    [ techs.cssStylus, {target: '?.noprefix.css'}],
                    [ techs.cssAutoprefixer, {
                        sourceTarget: "?.noprefix.css",
                        destTarget: '?.css',
                        browserSupport: ["> 2%", "last 2 versions", "Firefox ESR", "Opera 12.1", "Android >= 4", "iOS >= 5"]
                   }]
                ]);

                nodeConfig.addTargets(['?.js', '?.css', '?.bemhtml.js']);

            }else {
                nodeConfig.addTechs([
                    [require('enb-bem-techs/techs/levels'), {levels: getExamplesLevels(config)}],
                    [enbBemTechs.bemjsonToBemdecl],
                    [enbBemTechs.depsOld],
                    [enbBemTechs.files],
                    //CSS
                    [techs.cssStylus, {target: '?.noprefix.css'}],
                    [techs.cssAutoprefixer, {
                        sourceTarget: "?.noprefix.css",
                        destTarget: '?.css',
                        browserSupport: ["> 2%", "last 2 versions", "Firefox ESR", "Opera 12.1", "Android >= 4", "iOS >= 5"]
                    }],
                    //BEMHTML
                    [techs.bemtree, {sourceSuffixes: ['bemhtml', 'bemhtml.js']}],
                    //BEMHTML
                    [techs.bemhtml, {sourceSuffixes: ['bemhtml', 'bemhtml.js']}],
                    //HTML
                    [techs.htmlBeautify],
                    [techs.htmlFromJSON],
                    //client JS
                    [techs.browserJs],
                    [techs.fileMerge, {target: '?.pre.js', sources: ['?.bemhtml.js', '?.browser.js']}],
                    [techs.prependYm, {source: '?.pre.js'}]
                ]);

                nodeConfig.addTargets(['?.js', '?.css', '?.html', '?.browser.js', '?.beauty.html', '?.bemtree.js']);
            }
        });
    });

Ошибка возникает на этапе сборки бандлов(common-desktop и common-mobile) . При сборке которых нет необходимости провайдить .bemjson.js.

Не много дебага с помощьюnode.getTechs().

if(nodeConfig.getPath() === appConfig.examplesDir + '/common-desktop' || nodeConfig.getPath() === appConfig.examplesDir + '/common-mobile'){
           console.log(nodeConfig.getTechs());
           ......
}

На Windows результат будет пустой на OS X/Linux [ { _options: { target: '?.bemjson.js' } } ]

Хотелось бы разобраться, почему сборка ведет себя по разному на разных платформах?

Так уж получилось, что я разрабатываю сайты на Битриксе. В прошлом году сделали свой модуль, который позволяет нам подключать блоки из local/blocks в рантайм страницы. Ранее писал, что сборку проводим через gulp. Сейчас хотим пойти дальше: перенести сборку файлов технологий css, js на bem make и добавить собрку бандлов для страниц local/bundles.

С блоками я разобрался, с бандлами тоже, добавил технологию scss (по аналогии с sass). Что осталось?

  1. Изменить технологию scss, чтобы она заработала через gulp-compass – думаю, тут осилю я сам, нужно только время
  2. Настроить сборку файлов технологий (css, js) в папке блока
  3. Настроить сборку бандлов, сейчас получаю ошибку http://take.ms/3blFQ (мой .bem/make.js – http://pastebin.com/kQHFt736)
  4. Отключить при сборке бандла минификацию html

PS: про enb в курсе, если можете помочь в формулировании нужного формата сборки в терминах enb – буду только рад)

Продолжаю погружение. Давно мучает вопрос, что именно делает enb-magic-platform. Какова его роль в bem-core/bem-components. Должен ли я его хотеть для своей библиотеки.

Пишем:

import iBemDom from 'i-bem-dom';
class myBlock extends iBemDom {
  onSetMod : { ... },
  _onSubmit () {
  },
  static live () {
  }
}
export default myBlock;

получаем:

modules.define('my-block', ['i-bem-dom'], function (iBemDom) {
  var myBlock = iBemDom.decl('my-block', {
    onSetMod : { ... },
    _onSubmit : function () {
    }
  }, {
    live : function () {
    }
  })
  provide(myBlock);
});
  1. ES6 модули как абстракция для ym;
  2. ES6 классы как абстракция для inherit (а позже, возможно, для чего угодно).

Кому-то надо? Есть желание запилить?

На мой взгляд, надо:

  1. Сделать в enb возможность препроцессить файлы перед сборкой;
  2. Написать плагин для препроцессора с бабелем (есть https://github.com/s-panferov/enb-babel, но в этом случае весь код надо будет так);
  3. Подключить в .enb/make.js препроцессор;
  4. Получить профит и возможность писать так, где удобнее писать так, не меняя остального.

В качестве исключения можно про «хайлайтеры» для vim не вспоминать ;-)

/cc @blond @tadatuta

@tadatuta, @blond, @eGavr, @tormozz48, @alexbaumgertner и прочие причастные https://github.com/search?q=%22latedef%22%3A+%22nofucn%22&type=Code&utf8=%E2%9C%93

/nofucn/nofunc/

Всем привет!

Не подскажите, почему стили у блока могут не доопределяться? Использую свою библиотеку, стили из библиотеки подтягиваются, а из проекта нет. Уровни в make.js дописал. Использую enb. При этом с bem-tools отрабатывает нормально. Проект и библиотека на основе project-stub. На чистом project-stub такая же ситуация.

Есть ли способ делать спрайты из изображений блоков через enb?

Всем привет!

Создаю свою библиотеку, один из блоков без BEMHTML (для него описал только стили). При подключении библиотеки выдается ошибка ENOENT, что нет BEMHTML. Так и должно быть или это глюк? Если создать пустой BEMHTML, то все работает. Собираю проект с помощью enb. Кеш скидывал.

Здравствуйте команда BEM и сообщество. Изучаю сборщик enb. В данном примере - https://github.com/enb-bem/enb-bem-techs/blob/master/docs/build-page.md показана сборка страницы по bemjson. Сборка происходит без ошибок но файл page.html не создается. Вначале предположил, что надо добавить таргет для html.

nodeConfig.addTargets(['?.css', '?.js', '?.html']);

Но тогда сборка заканчивается с ошибкой Error: Match failed. Подскажите где кроется проблема.

Можно ли добавить условие в bemjson что бы блок написаный мной показывался только в IE > 9, по аналогии

{
    elem : 'conditional-comment',
    condition : '< IE 9',
    content : [
        { elem : 'js', url : '//yastatic.net/es5-shims/0.0.1/es5-shims.min.js' },
        { elem : 'js', url : '/js/modernizr-html5shiv-respond.min.js' }
    ]
},

Много где уже искал, но не могу найти. Создаю БЭМ блок-обертку над библиотекой из bower.io, но не могу понять как саму библиотеку подключить. Просто копировать файлы в папку с блоком считаю не правильным.

Подскажите что почитать/посмотреть чтобы начать писать тесты на блоки. В первую очередь интересует browser.js

Наблюдаю активность вокруг enb-bem-i18n, однако по описаниям технологий не до конца ясно с чем они работают. Подскажите какой процесс интернационализации ими поддерживается и реально ли его использовать в своих проектах?

У меня есть пара снипетов, которые можно потенциально оформить как библиотеку технологий для enb. Однако подобного опыта пока не имею.

var path = require('path'),
    EOL = require('os').EOL;

module.exports = require('enb/lib/build-flow').create()
    .name('angular-templates')
    .useFileList(['tmpl.html'])
    .target('target', 'templates.html')
    .justJoinFiles(function (filename, data) {
        return '<script type="text/ng-template" id="' + filename.split(path.sep).pop() + '">' + EOL + data + EOL + '</script>';
    })
    .createTech();
var ngAnnotate = require("ng-annotate");
module.exports = require('enb/lib/build-flow').create()
    .name('ng-annotate')
    .defineRequiredOption('source')
    .defineOption('target')
    .target('target', '?.js')
    .useSourceText('source')
    .builder(function(source){
        return ngAnnotate(source, { add : true }).src;
    })
    .createTech();

Что скажете? Надо ли это оформлять как библиотеку? @blond, поможешь?

Как известно у ZF своя файловая структура, и поэтому bem-tools нужно адаптировать под эту самую структуру, как?

Подскажите как настроить enb на сборку динамического сайта, так, чтобы bemdecl не генерировался при каждой сборке. Хочу руками прописать туда нужны блоки.

Добре!

Вопрос возник в работе.

Есть у меня бандлы, результат генерации которых нужен при сборке других бандлов.

Первые у меня запускаются по команде enb make -m first, вторые по enb make -m second.

Вопрос, как сделать так чтобы запускать билд с командой сервера?

enb make -m first -m second

Последовательность важна!

// именованные типы бандлов (хз для чего)
describe('page', 'pages/*', function (node) {
  addTech('blabla', {yolo swag params}); // как обычно
  addTargets(['html', 'css', '?.min.css']);
  // если ? не указан и нет точки — достраиваем до "?.css"

  afterTargetReady('?.min.css', function (target) {
    cp(target.path, releasePath + '/' + target.relativePath);
  });
  afterEach(function () {
    // запускаем после завершения обработки всех таргетов
    sed(node.targets['css'], 's/script/script yolo="swag"/g', '-i'); // условно
  });
});
after(function () {
  // finalizing build
  // cd release; cap deploy?
});

Или даже так:

describe('page', {
  path: 'pages/*',
  yoloswag: 'yes'
}, function (node) {
  // ...
});

При этом технологии можно отдавать списом сервисов по тиму architect (в package.json, например, или отдельном файле), в запускалке можно сделать так, чтобы она смотрела все bem-* пакеты, установленные в node_modules, и собирала сама оттуда технологии. Если какой-то пакет будет предоставлять расширения — он их может просто проксировать через себя.

При этом можно таким же параметром передать describe('all-bundles', { include: '*.bundles/*, exclude: '*.bundles/merged', к вопросу о merged бандле, и после этого в merged бандле указать, что он {include: '*.bundles/merged', dependsOn: 'all-bundles'}. Кажется, что и просто, и понятно. При этом в технологии эта информация о бандле (и его "конфигах") тоже попадет.

/cc @blond @tadatuta @vithar @veged

Привет , ребята!Я немного разобрала бэм, но столкнулась с проблемой такой. 1)Я свои картинки в bemjson, подключаю из папки img. У меня получается в теге идет следующее

<img src="/img/1.jpg"> это уже на выходе.

И после сборки , мне приходиться убирать слэш в ручную , есть ли способ этого избегать, чтобы не лезть и не исправлять это? Тоже самое , касается и картинок подключаемые в css. Можно как-то после команды make , менять относительные пути , на правильные, чтобы он убирал этот слэш. Я всегда работала на gulp , не много не привычно из каждого bundls собирать html в ручную и кидать в папку build. Это все, спасибочки.

Доброй ночи , друзья! Помогите разобраться с file-copy. Добавил в make.js вот это :

в
var techs {
   fileCopy: require('enb/techs/file-copy') - добавил строчку
}
затем пишу 
[techs.fileCopy, {
    source: '?.html',
    sourceNode: 'test' - я так понимаю, сюда указать в какую папку это полетит 
    target: '_?.html'
}]

запускаю enb make и получаю Cannot read property 'init' of undefined

Доброго времени суток, не могу понять как собирать для каждой страницы: 1) файл который содержит: i-bem, модульную систему, сторонние библиотеки. 2) файл который содержит код для каждого блока.

3) В режиме production так же собирать два файла: 1 Это один экземпляр файла который содержит: i-bem, модульную систему, сторонние библиотеки. 2 Файл со всеми кусочками для каждого блока.

С пунктом 3, есть несколько вариантов, но может есть уже готовые примеры.