Monorepositorio con Swift: organización de código para principiantes
Cuando comienzas a desarrollar aplicaciones en Swift para iOS o macOS, tarde o temprano te enfrentas a la pregunta: ¿cómo organizar el código para que no se convierta en un caos? Especialmente si tienes varios proyectos (por ejemplo, una aplicación iOS, una extensión watchOS y una parte de servidor con Vapor). Uno de los enfoques modernos es el monorepositorio (monorepo). En este artículo, analizaremos qué es un monorepositorio, por qué es necesario en el desarrollo con Swift y cómo organizarlo en la práctica.
¿Qué es un monorepositorio y por qué es necesario?
Un monorepositorio (monorepo) es un enfoque para la gestión de código en el que todos los proyectos, bibliotecas y módulos se almacenan en un solo repositorio (por ejemplo, en Git). A diferencia de los multirepositorios, donde cada proyecto vive en su propio almacenamiento separado, un monorepositorio lo unifica todo en un solo lugar.
Para los desarrolladores de Swift, esto ofrece varias ventajas:
- Versión única de dependencias — sabes exactamente qué versión de una biblioteca se utiliza en todos los proyectos.
- Refactorización simplificada — un cambio de API en una biblioteca se ve inmediatamente en todos los proyectos dependientes.
- Configuraciones compartidas — un solo SwiftLint, una sola configuración de CI/CD, unas mismas reglas de formato.
- Búsqueda fácil — todo en un solo lugar, sin necesidad de cambiar entre repositorios.
Sin embargo, también hay matices: un monorepositorio requiere disciplina y una estructura adecuada, de lo contrario se convierte en un «vertedero». Pero para los principiantes, es una excelente manera de aprender a organizar el código.
Estructura de un monorepositorio para proyectos Swift
Supongamos que estás creando una aplicación para iOS con módulos compartidos. Una estructura típica de un monorepositorio en Swift podría verse así:
MyMonorepo/├── Apps/│ ├── iOSApp/ # Aplicación iOS principal│ │ ├── Sources/│ │ ├── Resources/│ │ └── Package.swift│ └── macOSApp/ # Versión para macOS│ ├── Sources/│ └── Package.swift├── Packages/│ ├── Core/ # Utilidades comunes (redes, registro)│ │ ├── Sources/│ │ └── Package.swift│ ├── UIComponents/ # Componentes de UI reutilizables│ │ ├── Sources/│ │ └── Package.swift│ └── Analytics/ # Módulo de analítica│ ├── Sources/│ └── Package.swift├── Scripts/ # Scripts auxiliares├── .swiftlint.yml # Configuración única del linter├── Package.swift # Manifiesto raíz (opcional)└── README.mdObserva que aquí se utiliza Swift Package Manager (SPM) — la herramienta estándar para gestionar dependencias en Swift. Cada módulo es un Swift Package independiente que se puede conectar a las aplicaciones.
Cómo crear un monorepositorio en Swift: guía paso a paso
Vamos a crear un monorepositorio simple con dos módulos y una aplicación. Sigue estos pasos en la terminal:
Paso 1: Crea el directorio raíz e inicializa Git
mkdir MyMonorepocd MyMonorepogit initPaso 2: Crea la estructura de carpetas
mkdir -p Apps/iOSApp/Sourcesmkdir -p Packages/Core/Sourcesmkdir -p Packages/UIComponents/SourcesPaso 3: Crea el Package.swift para el módulo Core
Crea el archivo Packages/Core/Package.swift:
// swift-tools-version:5.9import PackageDescription
let package = Package( name: "Core", platforms: [ .iOS(.v16), .macOS(.v13) ], products: [ .library( name: "Core", targets: ["Core"]) ], targets: [ .target( name: "Core", path: "Sources") ])Paso 4: Escribe código simple en el módulo Core
Crea Packages/Core/Source