Монорепозиторій і мультирепозиторій – це два поширені підходи до організації та управління кодом за допомогою Git. Давайте детально розглянемо ці стратегії, їх переваги та недоліки.
Вступ
У більшості сучасних проєктів для управління та зберігання коду використовується Git. Він став стандартом для розподіленої розробки, контролю версій та спільної роботи. Git відомий своєю швидкістю та ефективністю. Існує два основних способи організації коду в Git:
Перш ніж ми детально розглянемо ці методи, давайте з’ясуємо, що таке репозиторій.
Що таке репозиторій?
Репозиторій (або репо) – це місце, де зберігаються усі папки і файли вашого проєкту. Він також містить інформацію про користувачів, їхні права та комп’ютери.
Дані у репозиторії відстежуються за версіями. Репозиторій може належати одній людині або цілій команді.
Git є системою керування репозиторіями. Репозиторій може бути публічним, приватним або внутрішнім. GitHub – це платформа для хостингу репозиторіїв Git із графічним інтерфейсом.
Git надає можливості контролю версій та обміну кодом. Особливість Git у тому, що розробники можуть скопіювати весь репозиторій на свій локальний комп’ютер, якщо хочуть внести зміни. Це дозволяє працювати над кодом навіть без прав на запис до оригінального репозиторію (так званий форк або розгалуження).
Після внесення локальних змін розробник може надіслати “запит на злиття” (pull request) власнику проєкту, щоб запропонувати свої зміни.
Проєкт може складатися з однієї або декількох служб. Якщо ваш проєкт має складну структуру, ви можете розділити його на кілька незалежних служб, кожна з яких виконує певні функції. Багато розробників вважають за краще розбивати великі проєкти на менші, самостійні сервіси, кожен з яких вирішує окремі бізнес-завдання. Популярність безсерверних фреймворків дозволяє отримувати доступ до функцій як до окремих сервісів.
Після створення цих функцій як окремих служб, наступним кроком є їх організація та контроль версій. Ви можете зберігати всі ваші сервіси в одному репозиторії (монорепо) або створити окремі репозиторії для кожної служби (мультирепо).
Що таке монорепозиторій?
Монорепозиторій – це підхід, коли усі сервіси вашого проєкту зберігаються в одному, єдиному репозиторії. При цьому кожною службою можна керувати та розгортати її окремо. Сервіси можуть спільно використовувати загальні бібліотеки та код.
Компанії, такі як Facebook, Google та Dropbox, використовують монорепозиторії.
Переваги монорепозиторію
- Увесь код проєкту знаходиться в одному місці, доступному для всієї команди
- Легко повторно використовувати код, обмінюватися ним та співпрацювати
- Легше відстежити, як ваші зміни вплинуть на весь проєкт
- Чудовий вибір для рефакторингу та масштабних змін коду
- Команда має повне розуміння структури проєкту
- Простіше керувати залежностями
Недоліки монорепозиторію
Монорепозиторій також має деякі недоліки, головний з яких – продуктивність. Зі збільшенням проєкту і кількості файлів, операції витягування, завантаження та інші можуть сповільнюватися, а пошук потрібних файлів займатиме більше часу.
Також, якщо ви залучаєте багато незалежних підрядників, надання доступу до усієї кодової бази може бути небезпечним.
Крім того, може бути складно реалізувати безперервне розгортання (CD), оскільки багато розробників можуть робити зміни одночасно, що змусить систему безперервної інтеграції (CI) багаторазово проводити перезбірку.
Великі компанії, що використовують монорепо, мають кастомні інструменти для вирішення проблем масштабування. Наприклад, Facebook використовує спеціальну файлову систему та систему контролю версій.
Що таке мультирепозиторій?
У підході з мультирепозиторіями, кожна бібліотека та служба проєкту знаходиться у власному окремому репозиторії. Якщо змінюється одна служба, то потрібно перезбирати лише її, а не весь проєкт. Команди можуть працювати над своїми службами незалежно і мати доступ лише до необхідного їм коду.
Компанії, такі як Netflix і Amazon, використовують мультирепозиторії.
Переваги мультирепозиторію
Багато компаній віддають перевагу мультирепозиторіям з таких причин:
- Кожна служба та бібліотека мають власну версію
- Операції з кодом (витягування, завантаження) є невеликими та швидкими, тому немає проблем з продуктивністю, навіть при великих розмірах проєкту
- Команди працюють незалежно і не потребують доступу до усієї кодової бази
- Швидша розробка та більша гнучкість
- Кожну службу можна випускати окремо і мати свій цикл розгортання, що спрощує впровадження CI та CD
- Кращий контроль доступу – не всім командам потрібен доступ до всіх бібліотек, але вони можуть отримати доступ для читання, якщо потрібно
Недоліки мультирепозиторію
- Залежності та бібліотеки, що використовуються у різних сервісах, потрібно регулярно оновлювати до останніх версій
- Сприяє відокремленій культурі, що може призводити до дублювання коду та розв’язання однієї проблеми різними командами
- Кожна команда може мати свої власні підходи до написання коду, що ускладнює впровадження загальних стандартів
Відмінності між монорепо та мультирепо
Давайте підсумуємо основні відмінності між цими двома підходами:
Монорепозиторій | Мультирепозиторій |
Увесь код організації зберігається в одному центральному репозиторії | Кожен сервіс та проєкт мають окремі репозиторії |
Команди можуть співпрацювати та бачити зміни один одного | Команди працюють автономно, зміни однієї команди не впливають на інші |
Усі мають доступ до усієї структури проєкту | Адміністратори можуть обмежувати доступ до певних проєктів та служб |
Проблеми з масштабуванням можуть виникнути при зростанні проєкту | Хороша продуктивність завдяки меншим розмірам репозиторіїв |
Складніше реалізувати безперервне розгортання (CD) та інтеграцію (CI) | Легше впровадити CD та CI, оскільки служби можна створювати окремо |
Легко ділитися бібліотеками, API та іншим загальним кодом, оновлюючи його в одному місці | Зміни в бібліотеках потрібно синхронізувати між репозиторіями |
Висновок
Обидва підходи – моно- та мульти-репозиторій – є популярними. Вибір залежить від розміру вашого проєкту, його вимог та необхідного рівня контролю версій та доступу.
Монорепозиторій робить акцент на узгодженості, а мультирепозиторій – на незалежності. У монорепозиторії вся команда бачить зміни, зроблені однією людиною, тоді як мультирепозиторій створює окремі репозиторії для кожної команди, яка має доступ лише до необхідних служб. Якщо ви хочете використовувати комбінацію моно- та мультирепозиторіїв, ви можете скористатися метаінструментом для керування кількома проєктами та бібліотеками.
Можливо, вас також зацікавлять безкоштовні ресурси для вивчення Git.