Probar gratis
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

BeneficioDesafío
Code sharingComplejidad de build
Cambios atómicosTiempo de CI
ConsistenciaGestión de permisos
VisibilidadTooling 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     │
└─────────────────────────────────────────────────────────────┘

Soluciones Relacionadas de GitScrum