Separare!
In effetti, probabilmente ho tre repository, uno per il Client e le librerie solo client corrispondenti, uno per il Server (e le librerie corrispondenti) e uno per le librerie condivise (incorporando le interfacce API che espongono la funzionalità tra i due, più qualsiasi altro codice condiviso). Penso che sia davvero la chiave, il codice condiviso dovrebbe andare in un proprio repository separato. In questo modo puoi assicurarti che l'interoperabilità tra client e server sia sempre alla stessa versione E sia isolata dal design di ciascuno dei suoi consumatori.
Ovviamente, questo non è sempre possibile, a seconda del particolare framework di comunicazione che stai utilizzando, ma è probabile che ci sia un codice condiviso che determina il formato degli oggetti di trasferimento dati o le fasi di handshake nel tuo protocollo personalizzato (o alcuni altro esempio).
Supponendo di avere un'integrazione continua abbastanza buona e una configurazione di QA (una supposizione abbastanza ampia, secondo la mia esperienza, ma ne farò comunque uno.) Se non si dispone di un dipartimento di QA, si dovrebbe almeno ottenere un CI ) non dovresti aver bisogno di usare il pattern single-repo come difesa contro possibili mis-match di codice, il tuo server CI segnalerà l'interoperabilità della libreria o il tuo team di controllo qualità rileverà errori di runtime (o, ancora meglio, i tuoi test di unità) volontà).
I vantaggi dei repository separati risiedono nella possibilità di eseguire separatamente le parti separate di un sistema. Vuoi prendere una copia del server della scorsa settimana ed eseguirlo con il client di questa settimana, per cercare di bloccare la radice di un problema di prestazioni? Nessun problema.