Архитектура · 0.8.1

Как устроен генератор

Manifest, нормализация, план, шаблоны и UI.

На этой странице

До этого речь шла о твоём приложении. Здесь показан отдельный репозиторий Admingen: он читает декларативную модель, приводит её к единому внутреннему представлению, строит план и создаёт файлы. Generator UI и дополнительный CLI вызывают общую прикладную логику.

Дерево показывает основные пути на примере Article, а не полный список файлов. Набор файлов зависит от модели и возможностей проекта.

Репозиторий генератора · основные пакеты

admingen/
├── cmd/
│   └── admingen/main.go
├── internal/
│   ├── domain/
│   │   ├── spec/              # контракт модели
│   │   │   ├── project.go
│   │   │   ├── types.go
│   │   │   └── validation.go
│   │   ├── normalized/        # нормализованная модель
│   │   │   ├── normalizer.go
│   │   │   ├── types.go
│   │   │   └── projection.go
│   │   └── generation/        # артефакты и их владение
│   │       ├── planner.go
│   │       ├── plan.go
│   │       └── migration_inventory.go
│   ├── app/                  # прикладные сценарии
│   │   ├── project/service.go
│   │   ├── plan/service.go
│   │   ├── generate/service.go
│   │   └── rollback/service.go
│   ├── adapters/             # CLI и HTTP
│   │   ├── cli/runner.go
│   │   └── http/server.go
│   └── infrastructure/
│       ├── manifest/         # хранение модели
│       │   ├── store.go
│       │   └── workflow.go
│       ├── templates/        # рендеринг
│       │   ├── renderer.go
│       │   └── registry.go
│       └── fs/               # файловая система
│           ├── osfs.go
│           └── retirement.go
├── templates/                # исходники шаблонов
│   ├── backend/
│   │   ├── app_service.go.tmpl
│   │   └── custom_hooks.go.tmpl
│   ├── admin/
│   │   ├── feature_form.tsx.tmpl
│   │   └── feature_custom_ui_extension.tsx.tmpl
│   ├── api/entity.yaml.tmpl
│   ├── db/schema_migration.sql.tmpl
│   └── project/
└── ui/admin/                 # интерфейс генератора
    └── src/
        ├── app/router.tsx
        ├── features/
        │   ├── entities/
        │   ├── generation/
        │   └── project/
        └── shared/

Domain определяет правила модели, app — операции над проектом. Чтение и запись файлов, HTTP и другие способы ввода-вывода находятся во внешних пакетах. Generator UI и CLI используют одни сценарии и одну модель, поэтому выбор интерфейса не меняет правила генерации.

Контракт модели

internal/domain/spec/ задаёт допустимое содержимое manifest: сущности, поля, связи и возможности проекта. На этот контракт опираются редактор Generator UI, CLI и генерация. Так все способы работы с проектом используют одно описание.

internal/domain/generation/planner.go определяет состав файлов, их пути и правила обновления. В templates/backend/, templates/admin/ и templates/project/ лежит текст шаблонов. Такое разделение позволяет изменять правила модели отдельно от создаваемого кода. Общие исправления генерации вносятся здесь, чтобы не повторять ручные правки в каждом приложении.

Нормализованная модель

internal/domain/normalized/ приводит имена, типы и связи к согласованному внутреннему представлению. Шаблоны получают уже подготовленные данные и не должны заново разбирать исходные настройки для каждого файла.

План файлов и правила обновления

internal/domain/generation/ определяет, какие файлы создать, где их разместить и кто ими управляет. По этим правилам генератор решает, что обновить, что сохранить и когда показать конфликт ручных изменений.

Прикладные сценарии

internal/app/ выполняет операции над проектом: изменение модели, подготовку плана, просмотр и применение генерации. Сценарии обращаются к интерфейсам хранения и рендеринга. Конкретные реализации чтения и записи подключаются снаружи.

HTTP для UI и команды CLI

internal/adapters/ принимает HTTP-запросы Generator UI и команды терминала. Он преобразует их в аргументы прикладных сценариев. Оба интерфейса используют общие правила работы с проектом.

Хранение модели

internal/infrastructure/manifest/ читает и сохраняет manifest проекта. Этот пакет отвечает за документ на диске; создание Go-кода и React-компонентов выполняется отдельно.

Рендеринг шаблонов

internal/infrastructure/templates/ подставляет подготовленные данные в шаблоны и получает содержимое будущих файлов. Здесь находится сам механизм рендеринга. Текст шаблонов лежит отдельно — в корневой папке templates/.

Работа с файловой системой

internal/infrastructure/fs/ реализует чтение и запись файлов. Прикладные сценарии используют эти операции, не смешивая детали работы с диском с правилами модели и текстом шаблонов.

Исходники шаблонов

В templates/ лежат заготовки Go-кода, React-компонентов, конфигурации и других создаваемых файлов. Чтобы изменить стандартную генерацию, правят соответствующий шаблон. После этого изменение можно получать через Generate, не повторяя его вручную в каждом проекте.

Интерфейс генератора

ui/admin/ содержит Generator UI: редактор модели, настройки проекта, Generate и History. Здесь работает разработчик приложения. Система администрирования для работы с его данными создаётся отдельно, из шаблонов.

Практические руководства