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: studio
y player
, y bibliotecas dependientes core
, graph
y network
, donde las dependencias son las siguientes:
core
es independientegraph
depende decore
(submódulo en./libs/core
)network
depende decore
(submódulo en./libs/core
)studio
depende degraph
ynetwork
(submódulos en./libs/graph
y./libs/network
)player
depende degraph
ynetwork
(submódulos en./libs/graph
y./libs/network
)
Supongamos que estamos usando CMake y que cada uno de estos proyectos tiene pruebas unitarias y todos los trabajos. Cada proyecto (incluido studio
y 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 core
se clona dos veces en el studio
proyecto. Además de este desperdicio de espacio en disco, tengo un problema de sistema de compilación porque estoy compilando core
dos 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
graph
ynetwork
dí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 alcore
submódulo local . - Introducir una dependencia adicional:
studio
oncore
. Luego,studio
compilacore
, establece la ruta de inclusión a su propia copia delcore
submódulo, luego construyegraph
ynetwork
en 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 graph
también puede requerir la actualización core
y network
obtener una versión compatible core
en todos los proyectos) .
Tiene alguna idea sobre esto?