== ТЗ: white labeling == {{ToC}} === intro === В процессе разработки ((http://git.altlinux.org/people/mike/packages/?p=mkimage-profiles-ltsp.git mkimage-profiles-ltsp)) на базе ((http://git.altlinux.org/people/boyarsh/packages/?p=mkimage-profiles-desktop.git mkimage-profiles-desktop)) и наблюдения за пробным камнем на пути whitelabeling, а именно школьным проектом (где часть разницы и есть в смене дизайна и текстовых строк) -- начало формироваться понимание не только гибкости ((Sisyphus:devel/mkimage mkimage)), но и желательности удобной схемы её использования для предотвращения непродуктивного форканья профилей (и целей сборки внутри них), инсталеров (и настроечных скриптов внутри них) и вообще блуждания фич вместе с багами в лучшей китайской манере copy-paste (например, идентичные копии ##postinstall.d/06-pxe.sh## присутствуют ныне в ##installer-{hpc,ltsp{,-school},junior}## -- как их предполагается улучшать, если, скажем, сделают ##control portmap server##?). По результатам предварительного обдумывания и обсуждения с boyarsh@, legion@, led@ решил написать с листов на столе не длинное письмо, а структурированную страничку. === цель ТЗ === Максимальная разумная ортогонализация профилей и инсталеров с тем, чтобы тратить время и силы на * создание и улучшение стыкующихся компонент а не на * отслеживание багфиксов в тех git repo, которые когда-то клонировались, * умножение бранчей на каждый чих отдела маркетинга (или свой) по части дизайна и см. п. 1, только с бранчами. Попросту говоря, вместо ##git-fetch git.alt:/people/boyarsh/repo/mkimage-profiles-desktop master:desktop## и последующего мержа (муторного, если мои и апстримные правки пересекаются) -- охота делать хотя бы ##--with-installer=ltsp-school --with-design=ltsp-school##, а когда-то -- ##./configure --with-distro=junior --with-features=ltsp,school## :) Это подразумевает также построение дерева ("водопада"?) требуемой для сборки информации -- от наиболее общей (тип дистрибутива) к частной (дизайн и мелкие особенности) с осмысленным наследованием значений по умолчанию частностями от общностей. При этом дизайн/носитель определяются вместе постановкой задачи для дистрибутива; не уверен насчёт их порядка или вообще зависимости друг от друга. Предлагаемый порядок: DISTRO; FLAVOUR; DESIGN; MEDIA; набор FEATURE; DOCS. Пример: DISTRO=Desktop, FLAVOUR=Lite, MEDIA=cd, остальное наследуется от предшественников (с заглавными буковками решено завязывать в пользу прописных). Или а-ля Rails: замена кучи перекладываний одного и того же набором договоренностей. === installer === Предлагается обдумать и произвести вынос часто используемых скриптов в пакеты с "фичами" инсталятора вида installer-feature-$(DISTRO)-$(FEATURE) для тех, которые могут иметь специфическое отношение к "кусту" инсталяторов (например, десктопных), или installer-feature-$(FEATURE) для наиболее неинтрузивных фич. Например, пресловутый ##postinstall.d/06-pxe.sh## просится в исходный пакет ##installer-feature-pxeboot## и бинарный ##installer-feature-pxeboot-stage2##. При таком подходе возможно как выстроить схему зависимостей (например, ##installer-feature-ltsp-stage2 Requires: installer-feature-pxeboot-stage2##), так и конфликты между скриптами, которые производят несовместимые изменения в одном и том же конфигурацинном файле. === mkimage-profiles === Наблюдаются следующие проблемы (на примере ##((http://git.altlinux.org/people/boyarsh/packages/?p=mkimage-profiles-desktop.git;a=tree;h=27723c8d084fe736588b127d217e8cf1cfb0d16b;hb=27723c8d084fe736588b127d217e8cf1cfb0d16b mkimage-profiles-desktop))## как наиболее развитого набора): * профили в силу своей нетривиальности размножаются методом клонирования и правки, при этом оригинал может "не ожидать" того стиля изменений, который производится, и не очень-то поддаваться ##git pull##; * сами профили могут иметь избыточность внутри * например, сейчас разница между 18-строчными файлами ##base-{cd,dvd}/Makefile.in## составляет одну строку, которая опять же различается лишь отчасти, но для анализа изменений требует не только ##diff##, но и глаз * см. тж. идентичные ##base-*/scripts.d/01-basesystem.manifest## * поток информации по переменным от ключей configure и toplevel Makefile может быть излишне опосредован и таким образом хрупок (см. выбор ##INFO_NAME##/##INFO_LABEL## в ##profiles/Makefile.in## в зависимости от имени файла ISO на выходе). === дизайн === Предлагается переключать по ##--with-design=## (умолчание наследуется от значения ##--with-distro## или установленного в профиле). Затрагиваемые группы пакетов: * alterator-design-* * design-alterator-browser-* (маленькое исключение -- qt-junior) * design-bootloader-* * design-bootsplash-* Реализация подразумевает добавление в ##profiles/base/Makefile.in::IMAGE_PACKAGES## (параметризованных) имён либо пакетов, либо списков таковых (при этом внутри списка параметризации уже нет). Первый способ обеспечивает гибкость на этапе сборки без модификации профиля: в параметрах configure можно передать произвольный суффикс -- но ограничивает таковую по части полноты набора дизайна: все пакеты должны быть, а некоторые из них при этом недостаточно даже скопировать, поскольку этот же суффикс используется в имени каталога). Второй способ позволяет класть частично адаптированный дизайн (например, ##design-graphics-ltsp-school##, ##design-alterator-browser-qt-junior## и ##alterator-design-desktop##), а также не класть его вообще -- но приводит к обязательности форка (части) профиля. Таким образом, первый способ должен хорошо подходить для "серьёзного" подхода к делу, когда дизайн делается полным по определению, но менять его желательно с минимальными затратами времени; второй -- для "домашнего", когда перекурочить профиль куда проще, чем возиться со всей стопкой дизайн-пакетов. Здесь разумным компромиссом пока выглядит первый вариант с разумным fallback на заведомо существующий вариант дизайна и упакованные "пустышки" для дизайна с именем ##none## на случай, когда таковой не требуется (пакет ##design-none##, который Provides: всё (не)нужное). === документация === Размышления аналогичны дизайну; предлагается docs-issue-$(DISTRO)_$(FLAVOUR). {{backlinks}}