Google, Meta, Microsoft, Airbnb хранят миллиарды строк кода в одном репозитории. Для небольших команд monorepo — не обязательно хорошая идея, но в ряде сценариев радикально упрощает разработку. Разберём когда, как и с чем.
Monorepo vs Polyrepo
Polyrepo (множество репозиториев)
- Каждый проект/пакет в своём репозитории
- Независимые CI/CD пайплайны
- Независимые версии зависимостей
Monorepo (один репозиторий)
- Все проекты в одном репозитории
- Общие зависимости, общий CI/CD
- Атомарные коммиты затрагивают несколько пакетов
Реальные преимущества monorepo
Атомарные изменения
В polyrepo изменение API в бэкенд-пакете требует: коммит в пакет → публикация новой версии → обновление версии в потребителях. В monorepo один коммит меняет API и все места использования одновременно. Рефакторинг безопаснее.
Единые инструменты и конвенции
ESLint, TypeScript config, Prettier — настраиваются один раз для всех проектов. Не нужно синхронизировать конфиги между репозиториями.
Совместное использование кода
packages/ui используется в web, mobile и email — без публикации в npm. Изменение в компоненте Button сразу видно во всех проектах.Единый CI/CD
Affected-based CI — пересобираются и тестируются только пакеты, затронутые изменениями. Не нужно ждать полной сборки всего проекта при изменении одного пакета.
Реальные недостатки
- Растущее время клонирования — репозиторий Google содержит 86 TB кода (shallow clone решает)
- Сложность разграничения доступа — нельзя дать подрядчику доступ только к одному проекту
- Риск нежелательных зависимостей — разработчики начинают импортировать из «соседних» пакетов произвольно
- Инструменты нужно освоить — Nx или Turborepo требуют времени на изучение
Turborepo
Turborepo (Vercel) — инструмент для оркестрации задач в monorepo. Главная фишка: кэширование артефактов сборки локально и в облаке (Remote Cache).
# turbo.json
{
"$schema": "https://turbo.build/schema.json",
"pipeline": {
"build": {
"dependsOn": ["^build"], // Сначала build зависимостей
"outputs": ["dist/**"] // Кэшируемые артефакты
},
"test": {
"dependsOn": ["build"],
"outputs": []
},
"lint": {
"outputs": []
}
}
}# package.json (root)
{
"scripts": {
"build": "turbo run build",
"test": "turbo run test",
"lint": "turbo run lint"
},
"devDependencies": {
"turbo": "latest"
}
}
# Структура
apps/
web/ # Next.js app
mobile/ # React Native app
admin/ # CRA admin panel
packages/
ui/ # Общая библиотека компонентов
utils/ # Shared утилиты
config/ # Shared конфиги (tsconfig, eslint)Nx
Nx (Nrwl) — более мощный инструмент с генераторами, lint rules для границ проектов, визуальным графом зависимостей.
# Создание workspace
npx create-nx-workspace@latest mycompany
# Добавление приложений и библиотек
nx generate @nx/react:app web-app
nx generate @nx/react:lib shared-ui
# Запуск только affected
nx affected:build # Собирает только изменённые
nx affected:test # Тестирует только затронутые
nx affected:lint
# Граф зависимостей
nx graphNx Lint Rules — границы
// .eslintrc.json — запрет произвольных зависимостей
{
"rules": {
"@nx/enforce-module-boundaries": ["error", {
"allow": [],
"depConstraints": [
{
"sourceTag": "scope:web",
"onlyDependOnLibsWithTags": ["scope:web", "scope:shared"]
},
{
"sourceTag": "scope:mobile",
"onlyDependOnLibsWithTags": ["scope:mobile", "scope:shared"]
}
]
}]
}
}Turborepo vs Nx: что выбрать
| Критерий | Turborepo | Nx |
|---|---|---|
| Сложность настройки | Низкая | Средняя |
| Генераторы кода | Нет | Да (мощные) |
| Граф зависимостей | Базовый | Визуальный, детальный |
| Lint правила для границ | Нет | Да |
| Remote cache | Vercel Remote Cache | Nx Cloud |
| Экосистема плагинов | Меньше | Больше |
Turborepo — быстрый старт, меньше ceremony. Nx — когда нужны генераторы, строгие границы, крупная команда.
FAQ
Нужен ли monorepo для команды из 2 человек?
Зависит от проекта. Если web-app, shared UI и API — один репозиторий удобен. Если три совершенно разных продукта — polyrepo проще.
Monorepo замедляет Git?
При большом размере — да. Решения: git sparse-checkout, git filter-branch, или Mercurial (как использует Facebook). Для команд до 50 человек обычно не проблема.
Как публиковать пакеты из monorepo в npm?
Changesets — стандартный инструмент. Разработчики описывают изменения в changesets, CI автоматически публикует нужные пакеты с правильными версиями.
pnpm workspaces vs Nx/Turborepo?
pnpm workspaces — менеджер зависимостей для monorepo (вместо npm/yarn). Nx/Turborepo — инструменты оркестрации задач. Они дополняют друг друга: pnpm workspaces + Turborepo — популярная связка.
Как мигрировать с polyrepo на monorepo?
git subtree или git filter-repo для переноса истории. Убедитесь что CI работает до и после.Настроим монорепозиторий для вашей команды
Выберем инструменты, настроим CI/CD, обучим команду. Monorepo, который помогает, а не мешает.
Нужна помощь с разработка?
Обсудим задачу, предложим решение и рассчитаем стоимость — бесплатно, без обязательств.