6 min lectura • Guide 360 of 877
Estrategias de Gestión de Monorepos
Los monorepos alojan múltiples proyectos en un solo repositorio. Bien hechos, simplifican sharing y consistencia. Mal hechos, se vuelven lentos, confusos y difíciles de mantener. Esta guía cubre enfoques prácticos para gestión de monorepos.
Trade-offs de Monorepo
| Beneficio | Desafío |
|---|---|
| Code sharing | Complejidad de build |
| Cambios atómicos | Tiempo de CI |
| Consistencia | Gestión de permisos |
| Visibilidad | Tooling requerido |
Estructura de Monorepo
ESTRUCTURA TÍPICA
═════════════════
MONOREPO DE PRODUCTO:
┌─────────────────────────────────────────────────────────────┐
│ │
│ my-company/ │
│ ├── apps/ │
│ │ ├── web/ # App web principal │
│ │ ├── mobile/ # App móvil │
│ │ ├── admin/ # Panel de admin │
│ │ └── api/ # Backend API │
│ │ │
│ ├── packages/ │
│ │ ├── ui/ # Componentes compartidos │
│ │ ├── utils/ # Utilidades comunes │
│ │ ├── config/ # Configuración compartida │
│ │ └── types/ # TypeScript types │
│ │ │
│ ├── tools/ │
│ │ ├── scripts/ # Build scripts │
│ │ └── generators/ # Code generators │
│ │ │
│ ├── package.json # Root package │
│ ├── turbo.json # Turborepo config │
│ └── nx.json # O Nx config │
│ │
└─────────────────────────────────────────────────────────────┘
Herramientas de Monorepo
COMPARACIÓN DE HERRAMIENTAS
═══════════════════════════
NX:
┌─────────────────────────────────────────────────────────────┐
│ ✅ Muy maduro, muchos plugins │
│ ✅ Excelente para proyectos Angular/React │
│ ✅ Buen análisis de dependencias │
│ ✅ Generators incluidos │
│ ❌ Curva de aprendizaje │
│ ❌ Puede sentirse "opinionated" │
└─────────────────────────────────────────────────────────────┘
TURBOREPO:
┌─────────────────────────────────────────────────────────────┐
│ ✅ Muy simple de adoptar │
│ ✅ Excelente caching │
│ ✅ Agnóstico de framework │
│ ✅ Bajo overhead │
│ ❌ Menos features que Nx │
│ ❌ Sin generators built-in │
└─────────────────────────────────────────────────────────────┘
PNPM WORKSPACES:
┌─────────────────────────────────────────────────────────────┐
│ ✅ Solo gestión de dependencias │
│ ✅ Muy eficiente en disco │
│ ✅ Combina bien con Turbo/Nx │
│ ❌ Sin build orchestration │
│ ❌ Sin caching │
└─────────────────────────────────────────────────────────────┘
BAZEL:
┌─────────────────────────────────────────────────────────────┐
│ ✅ Escala masiva (Google-scale) │
│ ✅ Builds herméticos │
│ ✅ Multi-lenguaje │
│ ❌ Muy complejo │
│ ❌ Curva de aprendizaje pronunciada │
└─────────────────────────────────────────────────────────────┘
Gestión de Dependencias
DEPENDENCIAS INTERNAS
═════════════════════
GRAFO DE DEPENDENCIAS:
┌─────────────────────────────────────────────────────────────┐
│ │
│ apps/web │
│ ├── packages/ui │
│ │ └── packages/utils │
│ ├── packages/config │
│ └── packages/types │
│ │
│ REGLAS: │
│ ├── apps/ pueden importar de packages/ │
│ ├── packages/ pueden importar de otros packages/ │
│ ├── packages/ NO importan de apps/ │
│ └── Evitar dependencias circulares │
│ │
└─────────────────────────────────────────────────────────────┘
WORKSPACE PROTOCOL:
┌─────────────────────────────────────────────────────────────┐
│ │
│ // apps/web/package.json │
│ { │
│ "dependencies": { │
│ "@company/ui": "workspace:*", // siempre local │
│ "@company/utils": "workspace:^", // compatible local │
│ "react": "^18.0.0" // npm normal │
│ } │
│ } │
│ │
└─────────────────────────────────────────────────────────────┘
Builds Eficientes
OPTIMIZACIÓN DE BUILDS
══════════════════════
BUILD SOLO LO CAMBIADO:
┌─────────────────────────────────────────────────────────────┐
│ │
│ Cambio en packages/utils: │
│ │
│ Afectados: │
│ ├── packages/utils (cambiado) │
│ ├── packages/ui (depende de utils) │
│ ├── apps/web (depende de ui) │
│ └── apps/admin (depende de ui) │
│ │
│ NO afectados: │
│ └── apps/api (no depende de utils) │
│ │
│ Solo buildear: utils → ui → web, admin │
│ Skipear: api │
│ │
└─────────────────────────────────────────────────────────────┘
CACHING:
┌─────────────────────────────────────────────────────────────┐
│ │
│ LOCAL CACHE: │
│ ├── Build de packages/ui ya cacheado │
│ ├── Si no cambió → usar cache │
│ └── Ahorra minutos en cada build │
│ │
│ REMOTE CACHE (Turborepo, Nx Cloud): │
│ ├── Cache compartido entre developers │
│ ├── Cache compartido con CI │
│ └── "Ya buildeado por otro" → instant │
│ │
└─────────────────────────────────────────────────────────────┘
CI/CD para Monorepos
PIPELINE DE CI
══════════════
PIPELINE INTELIGENTE:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 1. DETECTAR CAMBIOS │
│ └── ¿Qué packages/apps cambiaron? │
│ │
│ 2. CALCULAR AFECTADOS │
│ └── ¿Qué más depende de lo cambiado? │
│ │
│ 3. EJECUTAR EN PARALELO │
│ ├── Lint afectados │
│ ├── Test afectados │
│ └── Build afectados │
│ │
│ 4. USAR CACHE │
│ └── Skipear lo que ya está cacheado │
│ │
│ RESULTADO: CI de 30 min → 5 min │
│ │
└─────────────────────────────────────────────────────────────┘
EJEMPLO GITHUB ACTIONS:
┌─────────────────────────────────────────────────────────────┐
│ │
│ - name: Build affected │
│ run: npx turbo run build --filter=...[origin/main] │
│ │
│ - name: Test affected │
│ run: npx turbo run test --filter=...[origin/main] │
│ │
│ # Solo buildea/testea lo que cambió desde main │
│ │
└─────────────────────────────────────────────────────────────┘
GitScrum para Monorepos
ORGANIZACIÓN EN GITSCRUM
════════════════════════
OPCIÓN 1: UN PROYECTO
┌─────────────────────────────────────────────────────────────┐
│ Proyecto: MyCompany Platform │
│ │
│ Labels por area: │
│ ├── 🌐 app-web │
│ ├── 📱 app-mobile │
│ ├── 🔧 app-api │
│ ├── 🎨 pkg-ui │
│ └── 📦 pkg-utils │
│ │
│ ✅ Todo en un lugar │
│ ❌ Puede volverse ruidoso │
└─────────────────────────────────────────────────────────────┘
OPCIÓN 2: PROYECTOS POR DOMINIO
┌─────────────────────────────────────────────────────────────┐
│ Proyecto: Frontend Apps │
│ Proyecto: Backend Services │
│ Proyecto: Shared Packages │
│ │
│ ✅ Separación clara │
│ ✅ Equipos tienen su espacio │
│ ❌ Cross-cutting work más difícil │
└─────────────────────────────────────────────────────────────┘
TAGS PARA MONOREPO:
┌─────────────────────────────────────────────────────────────┐
│ 🔗 cross-package │ Afecta múltiples packages │
│ 📦 breaking-change │ Cambio que rompe compatibilidad │
│ 🔄 refactor │ Mejora sin cambio de behavior │
│ 📚 internal-dep │ Actualiza dependencia interna │
└─────────────────────────────────────────────────────────────┘