EMZETT.
Войти

Монорепозиторий: много проектов в одном репозитории

Коротко: Несколько связанных программ и библиотек живут вместе в одном репозитории Git вместо множества отдельных.

Подробнее: В монорепозитории фронтенд, бэкенд, общие библиотеки и инструменты делят один репозиторий, но обычно у них свои папки и пакеты. Так работают крупные компании вроде Google или Meta, а в мире JavaScript это распространено с инструментами вроде pnpm workspaces, Nx или Turborepo. Противоположность — полирепозиторий (polyrepo), в котором у каждого проекта свой репозиторий.

Подробности

Структура

my-company/
  apps/
    web/
    api/
  packages/
    ui/            общие строительные блоки
    config/
  package.json     конфигурация рабочего пространства

Пакеты ссылаются друг на друга через локальные зависимости, и одна команда устанавливает всё.

Преимущества

  • Атомарные изменения: изменение библиотеки и всех её пользователей можно сделать в одном коммите и pull request.
  • Общие инструменты: одна настройка линтинга и тестов, одна стратегия версионирования.
  • Лёгкое совместное использование кода без публикации пакетов.
  • Обзор: всё в одном месте, легко искать.

Недостатки и меры

Репозиторий становится большим, а наивные конвейеры пересобирают всё при каждом изменении. Современные инструменты собирают только затронутое (граф зависимостей) и используют кэш сборки, в том числе общий для команды. Права доступа труднее разделять по проектам; помогают файлы владельцев кода (CODEOWNERS). Очень большим репозиториям нужны возможности Git вроде sparse checkout.

Принятие решения

Для небольшой команды со связанными частями монорепозиторий часто удобнее. Если проекты независимы, с отдельными командами и циклами релизов, полирепозиторий может иметь больше смысла. Монорепозиторий — не то же самое, что монолит: сервисы и там можно собирать и поставлять отдельно.

См. также: Git, Конвейер CI/CD, SemVer, Модульный монолит