Monorepositorio con C#: organización del código y mejores prácticas
En el desarrollo moderno con C# (.NET), el enfoque de monorepositorio (monorepo) se utiliza cada vez más. A diferencia de los multirepositorios, donde cada proyecto vive en su propio repositorio Git, un monorepositorio almacena todo el código de la empresa o producto en un único repositorio central. Para los desarrolladores de .NET, esto significa una única solución (solution), bibliotecas compartidas y una configuración simplificada de CI/CD. En este artículo, analizaremos cómo organizar correctamente un monorepositorio con C#, proporcionaremos ejemplos de código y discutiremos las ventajas clave.
1. Ventajas del monorepositorio para .NET
El monorepositorio es especialmente útil para equipos que trabajan en varios proyectos .NET relacionados: microservicios, aplicaciones web, bibliotecas de clases. Las principales ventajas son:
- Versión única de dependencias — todos los proyectos utilizan las mismas versiones de paquetes NuGet, lo que elimina conflictos.
- Refactorización simplificada — un cambio en una interfaz común o modelo de datos se aplica inmediatamente a todos los consumidores.
- Historial Git compartido — los commits atómicos que afectan a varios proyectos son visibles en un solo lugar.
- CI/CD centralizado — un único pipeline para compilar, probar y desplegar todos los componentes.
Para C#, el monorepositorio se construye alrededor de un único archivo .sln (solution) que hace referencia a todos los proyectos. Esto permite utilizar las herramientas integradas de Visual Studio y .NET CLI para gestionar dependencias.
2. Estructura del monorepositorio para C#
Consideremos una estructura típica de monorepositorio para una solución .NET. Podría verse así:
MyCompany/├── src/│ ├── MyCompany.Common/ # Biblioteca común│ │ ├── MyCompany.Common.csproj│ │ └── ...│ ├── MyCompany.WebApi/ # Web API│ │ ├── MyCompany.WebApi.csproj│ │ └── ...│ └── MyCompany.BackgroundJob/ # Servicio en segundo plano│ ├── MyCompany.BackgroundJob.csproj│ └── ...├── tests/│ ├── MyCompany.Common.Tests/│ ├── MyCompany.WebApi.Tests/│ └── MyCompany.BackgroundJob.Tests/├── docs/ # Documentación├── scripts/ # Scripts para CI/CD├── .gitignore└── MyCompany.sln # Solución únicaElementos clave de esta estructura:
- src/ — carpeta con el código fuente. Cada proyecto es una carpeta separada con su propio archivo .csproj.
- tests/ — carpeta con pruebas. Los nombres de los proyectos de prueba repiten los nombres de los principales con el sufijo .Tests.
- docs/ — documentación (README, decisiones arquitectónicas).
- scripts/ — scripts para automatizar la compilación o el despliegue.
- MyCompany.sln — archivo de solución único que incluye todos los proyectos.
Esta estructura simplifica la navegación y permite agregar fácilmente nuevos proyectos sin cambiar la configuración raíz.
3. Configuración de la solución única y dependencias comunes
Para crear un monorepositorio en .NET, use el comando dotnet new sln y luego agregue proyectos:
# Crear la carpeta raíz y navegar a ellamkdir MyCompany && cd MyCompany
# Crear un archivo de solución vacíodotnet new sln -n MyCompany
# Crear la estructura de carpetasmkdir src tests docs scripts
# Crear proyectosdotnet new classlib -n MyCompany.Common -o src/MyCompany.Commondotnet new webapi -n MyCompany.WebApi -o src/MyCompany.WebApidotnet new console -n MyCompany.BackgroundJob -o src/MyCompany.BackgroundJob
# Agregar proyectos a la solucióndotnet sln add src/MyCompany.Common/MyCompany.Common.csprojdotnet sln add src/MyCompany.WebApi/MyCompany.WebApi.csprojdotnet sln add src/MyCompany.BackgroundJob/MyCompany.BackgroundJob.csprojAhora agreguemos una referencia a la biblioteca común desde la Web API: