==rebuild

===Описание
Перловый скрипт, генерящий из ##.raw.xml## файлы с css-, js-, xsl-импортами

((../raw.wiki Подробнее про .raw.xml))

===Способ применения

====Изменение проектного xml'я и перегенерация проектных файлов
Например, для проекта mail (Почта):
%%(sh)
svn co https://svn.yandex.ru/lego/versions/2.2 lego # чекаутим себе нужную версию Лего
cd lego/service/mail
vim mail.raw.xml # вносим необходимые изменения
../../tools/rebuild # перегенерить папку проекта mail
svn st # смотрим что изменилось
svn ci -m "mail rebuild" # коммитим
%%



====Перегенерация всех проектов
%%(sh)
svn co https://svn.yandex.ru/lego/versions/2.2 lego # чекаутим себе нужную версию Лего
cd lego/service
../tools/rebuild # перегенерить все проектные папки
svn st # смотрим что изменилось
svn ci -m "total rebuild" # коммитим
%%

**Важно**. Делать ##rebuild## следуют на свежеапнутой копии репозитория без модифицированных файлов. А лучше всего на свежем чекауте.
Скрипт работает с рабочей копией репозитория, в частности, проверяет наличие или отсутствие файлов -- если каких-то файлов не будет (не было svn up) или же наоборот, будет собраны неверные импорт-файлы и где-нибудь вылезет труднообнаружимая ошибка.



===Что делает rebuild
Скрипт рекурсивно ищет в текущей или указанной проектной папке файлы вида ##*.raw.xml##. Например, пусть это будет опять Почта -- ##service/mail/mail.raw.xml##.
Далее, в зависимости от того, указан ли флаг ##need-localization## или нет, генерится один или несколько xml'ей.

====Флаг need-localization
В секции ##global## проектного ##mail.raw.xml## может присутствовать флаг ##need-localization##:
%%(html)
<lego:page xmlns:lego="https://lego.yandex-team.ru">
    <global>
        <id>mail</id>
        <css-global>noreset</css-global>
        <css-need-reset/>
        <need-localization/> <!-- ! -->
    </global>
    ...
%%
В этом случае создадутся/перегенерятся файлы ##service/mail/mail.ru.xml##, ##service/mail/mail.en.xml## и ##service/mail/mail.uk.xml## (текущий список поддерживаемых локалей), если же флаг не указан, то создастся/перегенерится только ##service/mail/mail.ru.xml##.

((../localization.wiki Подробнее про локализацию))



====Файлы с импортами
После того как сгенерены файлы ##mail.{ru,uk,en}.xml## уже по ним (а точнее по ##mail.ru.xml##) генерятся файлы:
  * ##mail.css## -- список всех нужных css-импортов
  * ##mail.ie.css## -- тоже самое, но для IE
  * ##mail.js## -- список js-импортов 
  * ##mail.xsl## -- xsl-импорты
Все эти файлы нужно подключать к соответствующим проектным файлам, для последующей сборки.

===Как rebuild работает
Если коротко, то происходит обход xml-дерева. Из дерева выцепляются все xpath'ы, соответствующие независимым блокам, вложенным блокам и модификаторам, затем по ним строятся пути на файлсистеме. Если по этому пути существует файл, он включается в импорт.

Например:
%%(html)
    <lego:l-head>
        <lego:b-head-logo>
            <lego:name/>
        </lego:b-head-logo>
        <lego:b-head-tabs lego:theme="grey">
        ...
    ...
%%
Из этого куска дерева будут выделены следующие пути:
  * ##l-head/l-head## -- все, что начинается с l- или b- считается независимым блоком и откладывается от корня
  * ##b-head-logo/b-head-logo##
  * ##b-head-logo/name/b-head-logo.name## -- необязательный вложенный элемент
  * ##b-head-tabs/b-head-tabs##
  * ##b-head-tabs/_theme/b-head-tabs_grey## -- модификатор
(По прежнему считаем, что речь идет о проекте mail.)
Эти пути будут отложены сперва от ##/common/block##, а потом от ##/service/mail/block##, к ним будет дописаны соответствующие расширения и все, что будет существовать по этим путям сложится в ##mail.css##, ##mail.xsl##, ...

mail.css:
%%(css)
@import url(../../common/block/global/_type/global_noreset.css);
@import url(../../common/block/l-head/l-head.reset.css);
@import url(../../common/block/l-head/l-head.css);
@import url(../../common/block/b-head-logo/b-head-logo.css);
@import url(../../common/block/b-head-logo/name/b-head-logo.name.css);
@import url(../../common/block/b-head-tabs/b-head-tabs.css);
@import url(../../common/block/b-head-tabs/_theme/b-head-tabs_grey.css);
...
%%

Для css-файлов могут быть добавлены дополнительные импорты.
%%(html)
<global>
    <css-global>noreset</css-global>
    <css-need-reset/>
</global>
%%
Первая директива показывает какой ##global*.css## должен быть подключен. Вторая -- нужно ли подключать файлы вида ##*.reset.css##, резетящие отдельные компоненты.

((../raw.wiki Подробнее про <global>))

