Монорепозиторій - кілька проєктів (застосунки, пакети, сервіси) в одному репозиторії. 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;
- ключове питання: як часто зміна в одному проєкті вимагає зміни в іншому. Часто - монорепозиторій, рідко - окремі репозиторії.