Git Struttura del repository per progetti interdipendenti

2

Nota: ho visto molte altre domande sull'organizzazione del repository, ma non ne ho trovato nessuno con questo problema di dipendenza

Struttura corrente

Al momento abbiamo diverse distribuzioni (che devono rimanere come repository indipendenti - sono più o meno specifiche del client e non possono essere condivise), che hanno tutte un repository di librerie come modulo. Questo, a sua volta, dipende da qualche altro strato, sebbene questi strati inferiori siano piuttosto incastonati.

Questo è, approssimativamente, l'aspetto della struttura attuale ( Distro è un elenco sempre crescente di distribuzioni):

Distro
+-Library Collection
  +-Utility wrapper
    +-Inner core

Il problema qui è il repository Library Collection . Questo include alcune dozzine di librerie al momento, ma continua a crescere ad un ritmo accelerato. Di conseguenza, questo diventa ingombrante da mantenere e mi aspetto che Git inizi a sperimentare alcuni problemi di prestazioni nei prossimi anni.

Inoltre, la maggior parte delle distribuzioni include il codice che potrebbe dover finire in Library Collection in futuro, sebbene sia difficile da prevedere e dipende in gran parte da fattori esterni.

Vorremmo trovare un modo per dividere Library Collection in modo tale che ogni distribuzione possa scegliere e scegliere qualsiasi libreria individuale di cui ha bisogno, mantenendo l'organizzazione del progetto (principalmente CMake) abbastanza semplice. Idealmente, sarebbe simile a questo:

Distro
+-Lib A
+-Lib B
+-Utility wrapper
  +-Inner core

Dipendenze

Nella struttura attuale, ogni repository dipende dal livello successivo (a volte, anche se raramente, da due livelli verso il basso); questo è il motivo per cui questa struttura del repository si è evoluta come è avvenuto.

Nella struttura ideale sopra, questo sistema di dipendenza nidificato si rompe. Lib A e Lib B entrambi dipendono da Utility Wrapper , che ora è al loro livello. Non vogliamo rendere Utility Wrapper un sottomodulo sia di Lib A sia di Lib B , perché questo porterà a molti dati ridondanti quando Distro è clonata (per non parlare dei mal di testa durante il debug).

Inoltre, c'è una possibilità che Lib B dipenda da Lib A , anche se questo varia tra le librerie.

Pur facendo un primo tentativo di dividere le librerie, ho dovuto ricorrere al lavoro su singole librerie all'interno di un repository di distribuzione, quindi il livello Distro potrebbe risolvere le dipendenze e comprendere le directory e il collegamento (usiamo CMake per tutti di questo, se cambia qualcosa).

Domanda

Qual è il modo migliore per organizzare questi repository, in modo che Lib A possa essere sviluppato / testato indipendentemente da Distro , anche se richiede Utility Wrapper e, possibilmente, alcune altre librerie allo stesso livello?

    
posta Nick 21.06.2018 - 01:01
fonte

1 risposta

7

Il controllo del codice sorgente non deve gestire le dipendenze.

I sottomoduli Git sono ottimi per la condivisione del codice della libreria finché i repository padre e figlio evolvono insieme e spesso è sufficiente che la gestione di questa relazione nel controllo del codice sorgente abbia senso.

Nel tuo caso, sorge il bisogno di svilupparli autonomamente. È necessario prestare la massima attenzione per garantire che non vengano introdotte modifiche di rottura, soprattutto se si hanno a che fare con più distro e clienti.

Non hai specificato uno stack tecnologico, ma la soluzione a questo problema è la gestione delle dipendenze. Se questo fosse .NET, NuGet è il tuo strumento ideale. Per Java sarebbe qualcosa come Mavin (e ce ne sono anche altri). JavaScript ha NPM, Ruby ha RubyGems, ecc.

Mantieni ciascuna libreria nel proprio repository, ma interrompi il mix del controllo del codice sorgente-figlio. Ogni libreria deve avere una versione del pacchetto associata a un numero di versione (correlato a Versione Semantica ). Ogni distro deve specificare esattamente quale numero di versione della maggior parte della libreria di cui ha bisogno. Quella libreria deve specificare quale versione ha bisogno per la prossima libreria in giù.

Distro A

  • Raccolta di librerie v1.0.3
    • Utility Wrapper v1.3.7
      • Inner Core v2.7.0

Distro B

  • Raccolta di librerie v1.2.0
    • Utility Wrapper v1.8.12
      • Inner Core v2.13.2

Un buon gestore di pacchetti può risolvere il grafico delle dipendenze e installare le versioni corrette di ciascuna libreria.

Il controllo del codice sorgente e la gestione delle dipendenze sono animali molto diversi e richiedono strumenti diversi.

    
risposta data 21.06.2018 - 02:38
fonte

Leggi altre domande sui tag