Nella nostra azienda, sviluppiamo software di sistema informativo in C # .NET, che ha un'architettura client-server-modulo. Il progetto del modulo non dipende direttamente dal progetto server / client, ma solo dalle parti condivise. Quindi la struttura dei progetti core ha questo aspetto con le loro dipendenze:
-
server dipende da
- libreria condivisa dal server
- libreria comune
-
client dipende da
- libreria condivisa dal client
- libreria comune
E la struttura del modulo si presenta così:
-
modulo dipende da
- libreria condivisa dal server
- libreria condivisa dal client
- libreria comune
Usiamo Git e le dipendenze sono messe in atto usando i sottomoduli. Ma questo porta a "submodule hell": in un progetto, che contiene solo client e server puri, abbiamo già alcune librerie ( common-shared ) due volte. Quindi svilupparli è difficile, perché possiamo cambiare solo una "copia" in un momento e questo porta all'incompatibilità della versione, quando eseguiamo insieme client e server.
I modulilo rendono ancora più complicato e inutilizzabile, perché moltiplicano le copie delle librerie. Quando alcuni moduli vengono creati con una versione errata della libreria, possono portare a incompatibilità con client e server.
Una soluzione menzionata consiste nell'impostare i progetti in modo che dipendano dalle librerie al livello superiore dell'albero delle directory, ma penso che sia un equivoco. Rende anche impossibile costruire repository usando l'errore di configurazione.
La soluzioneSecond sarebbe un monorepo, ma questo elimina la possibilità di tenere traccia dei problemi nella nostra istanza GitLab separatamente, eccetera ...
La soluzioneTerzo sta forse utilizzando NuGet, ma ciò rende i progetti di libreria non sviluppabili (dovremmo scrivere alcuni "progetti di test" per svilupparli separatamente).
Qual è la soluzione ottimale per questo codebase?
Grazie mille!