Es común que exista confusión entre los conceptos de monorepo y monolito, pero es crucial diferenciarlos. Un monorepo es una estrategia de organización de código donde múltiples proyectos y servicios se almacenan en un único repositorio. Esto facilita la gestión centralizada de dependencias y herramientas de desarrollo, permitiendo a los equipos colaborar de manera eficiente. Por otro lado, un monolito es un tipo de arquitectura de software en el que todos los componentes de una aplicación (como la interfaz de usuario, la lógica de negocio y la gestión de datos) están estrechamente integrados en una única base de código.
Monorepo no implica Monolito
Monorepo ≠ Monolito
Una vez que comprendes estas diferencias, se vuelven más evidentes. A continuación, presento una tabla que destaca las características clave:
Característica |
Monorepo |
Arquitectura Monolítica |
Alcance |
Gestión del repositorio, almacenando múltiples proyectos/servicios en un solo repositorio |
Estructura y diseño de una sola aplicación, todos los componentes en una única base de código |
Base de Código |
Múltiples servicios, bibliotecas y proyectos en un solo repositorio |
Una única base de código unificada para la aplicación |
Despliegue |
Los componentes pueden desplegarse independientemente (microservicios o aplicaciones independientes) |
Se despliega como una sola unidad, todo está integrado |
Granularidad |
Proyectos independientes en el mismo repositorio, pueden estar débilmente acoplados |
Todo está estrechamente integrado en una sola aplicación |
Versionado |
Todos los proyectos comparten la misma estrategia de versionado |
Una sola versión para toda la aplicación |
Escalabilidad |
Los servicios o componentes pueden escalarse independientemente |
Toda la aplicación debe escalarse como una sola unidad |
Complejidad |
La complejidad está en gestionar múltiples proyectos, dependencias y configuraciones |
La complejidad surge al escalar y mantener la aplicación monolítica a medida que crece |
Estructura del Monorepo
En un monorepo, todos los proyectos (microservicios y librerías compartidas) se encuentran en un mismo repositorio.
/Monorepo
|-- Monorepo.sln
|-- /src
| |-- /MicroserviceA
| |-- MicroserviceA.csproj
| |-- Program.cs
| |-- Startup.cs
| |-- /Controllers
| |-- ControllerA.cs
| |-- /Models
| |-- ModelA.cs
| |-- /MicroserviceB
| |-- MicroserviceB.csproj
| |-- Program.cs
| |-- Startup.cs
| |-- /Controllers
| |-- ControllerB.cs
| |-- /Models
| |-- ModelB.cs
| |-- /SharedLibrary
| |-- SharedLibrary.csproj
| |-- /Utilities
| |-- Utility.cs
| |-- /Models
| |-- SharedModel.cs
|-- /tests
| |-- /MicroserviceATests
| |-- MicroserviceATests.csproj
| |-- UnitTest1.cs
| |-- /MicroserviceBTests
| |-- MicroserviceBTests.csproj
| |-- UnitTest1.cs
|-- /README.md
|-- /.gitignore
Estructura de un Multirepo
/MicroserviceA
|-- MicroserviceA.sln
|-- /src
| |-- MicroserviceA.csproj
| |-- Program.cs
| |-- Startup.cs
| |-- /Controllers
| | |-- ControllerA.cs
| |-- /Models
| |-- ModelA.cs
|-- /tests
| |-- MicroserviceATests
| |-- MicroserviceATests.csproj
| |-- UnitTest1.cs
|-- README.md
|-- .gitignore
/MicroserviceB
|-- MicroserviceB.sln
|-- /src
| |-- MicroserviceB.csproj
| |-- Program.cs
| |-- Startup.cs
| |-- /Controllers
| | |-- ControllerB.cs
| |-- /Models
| |-- ModelB.cs
|-- /tests
| |-- MicroserviceBTests
| |-- MicroserviceBTests.csproj
| |-- UnitTest1.cs
|-- README.md
|-- .gitignore
/PackageUtilitieA
|-- PackageUtilitieA.sln
|-- /src
| |-- PackageUtilitieA.csproj
| |-- /Utilitie
| |-- UtilitieA.cs
|-- README.md
|-- .gitignore
/PackageUtilitieB
|-- PackageUtilitieB.sln
|-- /src
| |-- PackageUtilitieB.csproj
| |-- /Utilitie
| |-- UtilitieB.cs
|-- README.md
|-- .gitignore
Es probable que hayas notado que los paquetes como PackageUtilitieA o PackageUtilitieB, los paquetes npm o NuGet, a menudo se gestionan dentro de un monorepo:
/SharedLibraryAsMonoRepo
|-- SharedLibraryAsMonoRepo.sln
|-- /src
| |-- /PackageUtilitieA
| | |-- README.md
| | |-- .gitignore
| | |-- PackageUtilitieA.csproj
| | |-- /Utilitie
| | |-- UtilitieA.cs
| |-- /PackageUtilitieB
| | |-- README.md
| | |-- .gitignore
| | |-- PackageUtilitieB.csproj
| | |-- /Utilitie
| | |-- UtilitieB.cs
|-- README.md
Al final, la elección entre un monorepo y un multirepo dependerá de las necesidades específicas de tu equipo y proyecto, considerando aspectos como la colaboración, la gestión de dependencias y las estrategias de despliegue.
Otros artículos relacionado:
- Git: monorepo o multirepo.
- GitKraken y productividad. GitKraken es una excelente herramienta cuando trabajas con múltiples repositorios al mismo tiempo. Ofrece una interfaz intuitiva que centraliza la gestión de tus proyectos, permitiéndote visualizar y administrar todos tus repositorios de manera eficiente.
- Micro Frontends Estáticos versus Dinámicos.