Come succede a molti, il nostro progetto C ++ è cresciuto sempre di più, e alla fine ha colpito il punto in cui la manutenibilità inizia a essere un problema, soprattutto a causa dei tempi di costruzione: anche utilizzando ccache
, ogni modifica richiede da 30 da 5 a 5 minuti per ricostruire e testare (in realtà sembra che il "collegamento" sia la fase che richiede tempo, ma stiamo ancora indagando).
Il progetto consiste principalmente in una grande biblioteca scientifica, insieme ad alcune applicazioni che ne fanno uso. Ad esempio, ci sono applicazioni per aumentare i modelli di simulazione, o binding di linguaggio (python) per l'integrazione in altri pacchetti software.
Ora, sembrerebbe naturale dividere la libreria in librerie più piccole: il codice è già organizzato in "moduli", quindi questo non sarebbe un problema. Il problema è con la gestione delle dipendenze: possiamo pensare all'intero progetto come un grande DAG , dove ogni nodo è un modulo libreria o libreria esterna (a causa della natura del progetto, ci sono molte dipendenze esterne su altre librerie scientifiche).
Quindi, idealmente, quando lavoriamo su un modulo, vorremmo ricostruire solo quel modulo, più forse l'app di test correlata, e collegarlo alle sue dipendenze. Ciò accelererebbe considerevolmente il ciclo di sviluppo.
Di conseguenza, l'idea è di gestire ogni "modulo" come un progetto indipendente, che sarà costruito separatamente in una libreria (statica). Ho due dubbi su questo approccio:
- Immagina di lavorare sull'app A che dipende dalla libreria B, che a sua volta dipende dalla libreria C. Durante lo sviluppo, trovo che ho bisogno di una nuova funzione nella libreria C, quindi vado avanti e codificalo. Ora devo ricostruire manualmente la libreria C, quindi la libreria B e infine la libreria A prima di continuare con lo sviluppo. Quando la catena delle dipendenze aumenta, questo può essere problematico.
- Se cambiano le dipendenze di un modulo, come gestire l'impatto sull'intero DAG (altri moduli che cambiano di conseguenza)?
Ho svolto ricerche su diversi strumenti che potrebbero aiutare il mio scenario. I sottomoduli Git sono un'opzione, ma non affronta le mie preoccupazioni sopra. Apache Ivy non sembra adatto a quello che sto cercando di ottenere. Sospetto che la risposta implichi un potente sistema di build (stiamo usando qmake ), quindi ho guardato in cmake (ma ho trovato il suo linguaggio di scripting limitato e difficile da imparare), e quindi buck e pants .
Non sono ancora sicuro se questa è la strada da percorrere, quindi sarei grato se qualcuno potesse condividere consigli e / o esperienze.