Monorepositorio con C++: organización de código y mejores prácticas

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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 desarrollo


Principios 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-failure


3. 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

Blogs

Book Recommendations