Soy un gran admirador de los submódulos Git . Me gusta poder rastrear una dependencia junto con su versión, para que pueda retroceder a una versión anterior de su proyecto y tener la versión correspondiente de la dependencia para construir de forma segura y limpia. Además, es más fácil lanzar nuestras bibliotecas como proyectos de código abierto, ya que el historial de las bibliotecas es independiente del de las aplicaciones que dependen de ellas (y que no serán de código abierto).
Estoy configurando el flujo de trabajo para múltiples proyectos en el trabajo, y me preguntaba cómo sería si tomáramos este enfoque un poco extremo en lugar de tener un solo proyecto monolítico. Rápidamente me di cuenta de que es una lata potencial de gusanos en realidad el uso de sub-módulos.
Supongamos un par de aplicaciones: studioy player, y bibliotecas dependientes core, graphy network, donde las dependencias son las siguientes:
corees independientegraphdepende decore(submódulo en./libs/core)networkdepende decore(submódulo en./libs/core)studiodepende degraphynetwork(submódulos en./libs/graphy./libs/network)playerdepende degraphynetwork(submódulos en./libs/graphy./libs/network)
Supongamos que estamos usando CMake y que cada uno de estos proyectos tiene pruebas unitarias y todos los trabajos. Cada proyecto (incluido studioy player) debe poder compilarse de forma independiente para realizar métricas de código, pruebas unitarias, etc.
La cosa es que, de forma recursiva git submodule fetch, obtienes la siguiente estructura de directorios:
studio/
studio/libs/ (sub-module depth: 1)
studio/libs/graph/
studio/libs/graph/libs/ (sub-module depth: 2)
studio/libs/graph/libs/core/
studio/libs/network/
studio/libs/network/libs/ (sub-module depth: 2)
studio/libs/network/libs/core/
Tenga en cuenta que corese clona dos veces en el studioproyecto. Además de este desperdicio de espacio en disco, tengo un problema de sistema de compilación porque estoy compilando coredos veces y potencialmente obtengo dos versiones diferentes de core.
Pregunta
¿Cómo organizo los submódulos para obtener la dependencia versionada y la compilación independiente sin obtener múltiples copias de submódulos anidados comunes?
Solución posible
Si la dependencia de la biblioteca es algo así como una sugerencia (es decir, en una forma "conocida por funcionar con la versión X" o "solo la versión X es oficialmente compatible") y las aplicaciones o bibliotecas dependientes potenciales son responsables de construir con la versión que deseen, entonces Me imagino el siguiente escenario:
- Tenga el sistema de compilación
graphynetworkdígales dónde encontrarcore(por ejemplo, a través de una ruta de inclusión del compilador). Defina dos objetivos de compilación, "independiente" y "dependencia", donde "independiente" se basa en "dependencia" y agrega la ruta de inclusión para apuntar alcoresubmódulo local . - Introducir una dependencia adicional:
studiooncore. Luego,studiocompilacore, establece la ruta de inclusión a su propia copia delcoresubmódulo, luego construyegraphynetworken modo de "dependencia".
La estructura de carpetas resultante se ve así:
studio/
studio/libs/ (sub-module depth: 1)
studio/libs/core/
studio/libs/graph/
studio/libs/graph/libs/ (empty folder, sub-modules not fetched)
studio/libs/network/
studio/libs/network/libs/ (empty folder, sub-modules not fetched)
Sin embargo, esto requiere un poco de magia del sistema de compilación (estoy bastante seguro de que esto se puede hacer con CMake) y un poco de trabajo manual por parte de las actualizaciones de la versión (la actualización graphtambién puede requerir la actualización corey networkobtener una versión compatible coreen todos los proyectos) .
Tiene alguna idea sobre esto?