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: studio
e player
, e librerie dipendenti core
, graph
e network
, se le dipendenze sono i seguenti:
core
è autonomograph
dipende dacore
(sottomodulo at./libs/core
)network
dipende dacore
(sottomodulo at./libs/core
)studio
dipende dagraph
enetwork
(sottomoduli at./libs/graph
e./libs/network
)player
dipende dagraph
enetwork
(sottomoduli at./libs/graph
e./libs/network
)
Supponiamo che stiamo usando CMake e che ciascuno di questi progetti abbia unit test e tutte le opere. Ogni progetto (incluso studio
e 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 core
viene clonato due volte nel studio
progetto. A parte questo spreco di spazio su disco, ho un problema di sistema di compilazione perché sto costruendo core
due 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
graph
enetwork
dire 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 alcore
sottomodulo locale . - Introdurre una dipendenza aggiuntiva:
studio
attivacore
. Quindi,studio
creacore
, imposta il percorso di inclusione sulla propria copia delcore
sottomodulo, quindi creagraph
enetwork
in 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 graph
potrebbe anche richiedere l'aggiornamento core
e network
ottenere una versione compatibile di core
in tutti i progetti) .
Qualche idea su questo?