Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама

Монорепозиторій чи багато репозиторіїв: які переваги й проблеми кожного підходу?

Монорепозиторій - кілька проєктів (застосунки, пакети, сервіси) в одному репозиторії. Polyrepo - кожен проєкт в окремому репозиторії.

Переваги монорепозиторію:

  • атомарні зміни: змінити API пакета й усіх його споживачів одним комітом і одним pull request. У polyrepo це кілька узгоджених релізів у правильному порядку;
  • немає пекла версій: усі проєкти завжди використовують поточну версію спільного коду;
  • спільні інструменти: одна конфігурація Pint, PHPStan, CI, однакові правила;
  • видимість: легко знайти всі використання функції, зробити рефакторинг по всьому коду;
  • простіший онбординг: один клон - увесь контекст.

Проблеми монорепозиторію:

  • розмір і продуктивність Git: status, clone, checkout повільнішають (лікується частковим клоном, sparse-checkout, fsmonitor);
  • CI: запускати все на кожну зміну - дорого. Потрібні інструменти, що визначають, які проєкти зачеплені зміною (Nx, Turborepo, Bazel, Pants чи власні скрипти по git diff);
  • права доступу: Git не обмежує доступ до каталогів - бачать усі все (CODEOWNERS лише керує рев'ю);
  • зв'язність: легко створити залежності, яких не мало б бути, - потрібні правила меж між модулями.

Переваги polyrepo:

  • незалежні релізи, власний темп і власні інструменти кожної команди;
  • чіткі межі й права доступу;
  • маленькі швидкі репозиторії.

Проблеми polyrepo:

  • зміни через кілька репозиторіїв - кілька pull request, порядок випусків, тимчасова несумісність;
  • розбіжність версій: сервіси застрягають на старих версіях спільних пакетів;
  • дублювання конфігурацій CI, лінтерів, шаблонів.

Гібрид, яким користується Laravel: розробка в монорепозиторії laravel/framework, а компоненти автоматично розділяються в окремі репозиторії лише для читання (illuminate/database, illuminate/support), щоб їх можна було встановити окремо.

Як обрати:

  • кілька тісно пов'язаних проєктів однієї команди (застосунок, адмінка, спільні пакети) - монорепозиторій дає більше, ніж коштує;
  • незалежні продукти різних команд з різним циклом випусків - polyrepo;
  • ключове питання: як часто зміна в одному проєкті вимагає зміни в іншому. Часто - монорепозиторій, рідко - окремі репозиторії.

Докладніше в документації: monorepo.tools

Схожі питання