Soy un gran fan de submódulos Git . Me gusta poder rastrear una dependencia junto con su versión, para que pueda revertir 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 existe una lata potencial de gusanos en realmente usando sub-módulos.
Suponiendo un par de aplicaciones: studio
y player
, y bibliotecas dependientes core
, graph
y network
, donde las dependencias son las siguientes:
-
core
es independiente -
graph
depende decore
(submódulo en./libs/core
) -
network
depdends encore
(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 (incluidos studio
y player
) debe poder compilarse de forma independiente para realizar métricas de código, pruebas de unidad, etc.
La cosa es, un git submodule fetch
recursivo, luego obtienes la siguiente estructura de directorio:
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/
Observe que core
se clona dos veces en el proyecto studio
. Aparte de esta pérdida de espacio en el disco, tengo un problema en el 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?
Posible solución
Si la dependencia de la biblioteca es algo así como una sugerencia (es decir, en una forma "se sabe que funciona con la versión X" o "se admite oficialmente la única versión X") y las aplicaciones o bibliotecas dependientes potenciales son responsables de construir con cualquier versión como, entonces podría imaginar el siguiente escenario:
- Haga que el sistema de compilación para
graph
ynetwork
les diga 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 al sub-módulocore
local. - Introduzca una dependencia adicional:
studio
encore
. Luego,studio
generacore
, establece la ruta de inclusión a su propia copia del submódulocore
, luego generagraph
ynetwork
en el modo "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 algo de magia en el 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 de graph
también puede requerir la actualización de core
y network
para obtener una versión compatible de core
en todos los proyectos).
¿Alguna idea sobre esto?