Introducción: ¿Por qué necesitas un monorepositorio en C++?
El desarrollo de grandes proyectos de C++ a menudo se enfrenta al problema de la organización del código. Los equipos eligen entre un monorepositorio (un único repositorio para todo el código) y un multirrepositorio (repositorios separados para cada biblioteca). En el contexto de C++, un monorepositorio ofrece varias ventajas: simplificación de la refactorización, una versión única de dependencias y un sistema de compilación centralizado.
Este artículo te guiará a través de los aspectos clave de la organización de un monorepositorio para C++: desde la estructura de carpetas hasta la configuración de CMake y la gestión de dependencias. Aprenderás cómo hacer que el proyecto sea escalable y conveniente para el equipo.
1. Estructura del monorepositorio para C++
Una estructura correcta es la base de un monorepositorio exitoso. Se recomienda usar una jerarquía que separe las bibliotecas, las aplicaciones y las dependencias externas.
Ejemplo de estructura básica
my_monorepo/├── CMakeLists.txt # Archivo CMake raíz├── cmake/ # Módulos CMake auxiliares├── libs/ # Bibliotecas del proyecto│ ├── core/ # Núcleo (lógica, utilidades)│ │ ├── include/│ │ │ └── core/│ │ ├── src/│ │ └── CMakeLists.txt│ ├── network/ # Módulos de red│ │ ├── include/│ │ ├── src/│ │ └── CMakeLists.txt│ └── utils/ # Utilidades auxiliares│ ├── include/│ ├── src/│ └── CMakeLists.txt├── apps/ # Aplicaciones ejecutables│ ├── server/│ │ ├── src/│ │ └── CMakeLists.txt│ └── client/│ ├── src/│ └── CMakeLists.txt├── tests/ # Pruebas de integración├── third_party/ # Dependencias externas (git submodules)│ ├── fmt/│ └── spdlog/└── scripts/ # Scripts para CI/CD y desarrolloPrincipios clave
- libs/: Cada biblioteca es un módulo autónomo con su propio CMakeLists.txt.
- apps/: Las aplicaciones usan las bibliotecas a través de
target_link_libraries. - third_party/: Las dependencias externas se añaden mediante git submodules o FetchContent.
- tests/: Un directorio separado para pruebas que verifican la integración de componentes.
2. Sistema de compilación: CMake para el monorepositorio
CMake es la herramienta estándar para proyectos de C++. En un monorepositorio, permite gestionar las dependencias entre bibliotecas y aplicaciones.
CMakeLists.txt raíz
Crea un archivo raíz que incluya todos los subproyectos:
cmake_minimum_required(VERSION 3.20)project(MyMonorepo VERSION 1.0.0 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20)set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Incluir dependencias externasadd_subdirectory(third_party/fmt)add_subdirectory(third_party/spdlog)
# Incluir bibliotecasadd_subdirectory(libs/core)add_subdirectory(libs/network)add_subdirectory(libs/utils)
# Incluir aplicacionesadd_subdirectory(apps/server)add_subdirectory(apps/client)
# Incluir pruebasenable_testing()add_subdirectory(tests)Ejemplo de CMakeLists.txt para una biblioteca
# libs/core/CMakeLists.txtadd_library(core src/core_module.cpp src/utilities.cpp)
target_include_directories(core PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_link_libraries(core PUBLIC fmt::fmt spdlog::spdlog)Compilación y pruebas
Para compilar todo el proyecto, usa:
mkdir build && cd buildcmake .. -DCMAKE_BUILD_TYPE=Releasecmake --build . --parallelctest --output-on-failure3. Gestión de dependencias en el monorepositorio
Uno de los principales problemas del monorepositorio es el control de versiones de las dependencias. En C++, hay varias