Sono un grande fan dei sottomoduli Git . Mi piace essere in grado di tracciare una dipendenza insieme alla sua versione, in modo da poter eseguire il rollback a una versione precedente del progetto e avere la versione corrispondente della dipendenza da costruire in modo sicuro e pulito. Inoltre, è più facile rilasciare le nostre biblioteche come progetti open source poiché la cronologia delle biblioteche è separata da quella delle applicazioni che dipendono da esse (e che non saranno open source).
Sto impostando il flusso di lavoro per più progetti al lavoro e mi chiedevo come sarebbe se avessimo adottato questo approccio un po 'estremo invece di avere un singolo progetto monolitico. Mi sono reso rapidamente conto che esiste una potenziale lattina di worm che utilizza davvero i sottomoduli.
Supponendo una coppia di applicazioni: studioe player, e librerie dipendenti core, graphe network, se le dipendenze sono i seguenti:
coreè autonomographdipende dacore(sottomodulo at./libs/core)networkdipende dacore(sottomodulo at./libs/core)studiodipende dagraphenetwork(sottomoduli at./libs/graphe./libs/network)playerdipende dagraphenetwork(sottomoduli at./libs/graphe./libs/network)
Supponiamo che stiamo usando CMake e che ciascuno di questi progetti abbia unit test e tutte le opere. Ogni progetto (incluso studioe player) deve poter essere compilato autonomamente per eseguire metriche di codice, unit test, ecc.
Il fatto è, ricorsivo git submodule fetch, quindi ottieni la seguente struttura di directory:
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/
Si noti che coreviene clonato due volte nel studioprogetto. A parte questo spreco di spazio su disco, ho un problema di sistema di compilazione perché sto costruendo coredue volte e potenzialmente ottengo due diverse versioni di core.
Domanda
Come organizzare i sottomoduli in modo da ottenere la dipendenza con versione e la build autonoma senza ottenere più copie dei sottomoduli nidificati comuni?
Possibile soluzione
Se la dipendenza dalla libreria è in qualche modo un suggerimento (vale a dire in un modo "noto per funzionare con la versione X" o "solo la versione X è ufficialmente supportata") e le potenziali applicazioni o librerie dipendenti sono responsabili della costruzione con qualsiasi versione che preferiscono, allora Potrei immaginare il seguente scenario:
- Avere il sistema di compilazione per
graphenetworkdire loro dove trovarecore(ad esempio tramite un percorso di inclusione del compilatore). Definire due target di build, "standalone" e "dipendenza", in cui "standalone" si basa su "dipendenza" e aggiunge il percorso di inclusione per puntare alcoresottomodulo locale . - Introdurre una dipendenza aggiuntiva:
studioattivacore. Quindi,studiocreacore, imposta il percorso di inclusione sulla propria copia delcoresottomodulo, quindi creagraphenetworkin modalità "dipendenza".
La struttura delle cartelle risultante è simile a:
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)
Tuttavia, ciò richiede un po 'di magia per il sistema di compilazione (sono abbastanza sicuro che questo possa essere fatto con CMake) e un po' di lavoro manuale da parte degli aggiornamenti della versione (l'aggiornamento graphpotrebbe anche richiedere l'aggiornamento coree networkottenere una versione compatibile di corein tutti i progetti) .
Qualche idea su questo?