Je suis un grand fan des sous-modules Git . J'aime pouvoir suivre une dépendance avec sa version, de sorte que vous puissiez revenir à une version précédente de votre projet et disposer de la version correspondante de la dépendance pour construire en toute sécurité et proprement. De plus, il est plus facile de publier nos bibliothèques sous forme de projets open source car l'historique des bibliothèques est séparé de celui des applications qui en dépendent (et qui ne seront pas en open source).
J'établis un flux de travail pour plusieurs projets au travail, et je me demandais ce qui se passerait si nous adoptions cette approche un peu extrême au lieu de n'avoir qu'un seul projet monolithique. J'ai vite compris qu'il y avait un potentiel de ver à utiliser réellement des sous-modules.
Supposons une paire d'applications: studio
et player
, et des bibliothèques dépendantes core
, graph
et network
, où les dépendances sont les suivantes:
core
est autonomegraph
dépend decore
(sous-module à./libs/core
)network
dépend decore
(sous-module à./libs/core
)studio
dépend degraph
etnetwork
(sous-modules à./libs/graph
et./libs/network
)player
dépend degraph
etnetwork
(sous-modules à./libs/graph
et./libs/network
)
Supposons que nous utilisions CMake et que chacun de ces projets comporte des tests unitaires et tous les travaux. Chaque projet (y compris studio
et player
) doit pouvoir être compilé de manière autonome pour effectuer des métriques de code, des tests unitaires, etc.
La chose est, un récursif git submodule fetch
, alors vous obtenez la structure de répertoire suivante:
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/
Notez que core
deux fois cloné dans le studio
projet. Outre ce gaspillage d'espace disque, j'ai un problème de système de génération, car je construis core
deux fois et j'obtiens potentiellement deux versions différentes de core
.
Question
Comment organiser des sous-modules de manière à obtenir la dépendance versionnée et la génération autonome sans obtenir plusieurs copies des sous-modules imbriqués courants?
Solution possible
Si la dépendance de la bibliothèque est en quelque sorte une suggestion (c'est-à-dire d'une manière "connue pour fonctionner avec la version X" ou "seule la version X est officiellement prise en charge") et que les applications ou bibliothèques potentiellement dépendantes sont responsables de la construction avec la version de leur choix, Je pourrais imaginer le scénario suivant:
- Demandez au système de construction de
graph
etnetwork
dites-leur où trouvercore
(par exemple, via un chemin d’inclusion du compilateur). Définissez deux cibles de construction, "autonome" et "dépendance", où "autonome" est basé sur "dépendance" et ajoute le chemin d'inclusion pour pointer vers lecore
sous-module local . - Introduisez une dépendance supplémentaire:
studio
oncore
. Ensuite,studio
buildscore
, définit le chemin d’inclusion sur sa propre copie ducore
sous-module, puis construitgraph
etnetwork
en mode "dépendance".
La structure de dossier résultante ressemble à ceci:
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)
Cependant, cela nécessite un peu de magie du système de construction (je suis assez confiant, cela peut être fait avec CMake) et un peu de travail manuel de la part des mises à jour de version (la mise à jour graph
peut également nécessiter une mise à jour core
et network
obtenir une version compatible de core
tous les projets) .
Des idées à ce sujet?