200+ проектовДоговорNDAГарантия 12 мес.Оплата по этапам
Разработка

Монорепозиторий: плюсы, минусы, инструменты (Nx, Turborepo)

Монорепозиторий vs polyrepo: сравнение подходов, инструменты Nx и Turborepo, когда стоит переходить, практика крупных компаний.

23 августа 2026
Монорепозиторий: плюсы, минусы, инструменты (Nx, Turborepo)

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 graph

Nx 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: что выбрать

КритерийTurborepoNx
Сложность настройкиНизкаяСредняя
Генераторы кодаНетДа (мощные)
Граф зависимостейБазовыйВизуальный, детальный
Lint правила для границНетДа
Remote cacheVercel Remote CacheNx 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, который помогает, а не мешает.

[ Gulaev.Dev ]

Нужна помощь с разработка?

Обсудим задачу, предложим решение и рассчитаем стоимость — бесплатно, без обязательств.

FAQ по статье

Часто задаваемые вопросы