Il controllo della versione deve contenere il codice e la configurazione necessari per compilare l'applicazione.
Ciò significa che:
Le cose temporanee che sono state introdotte per un breve periodo di tempo (il tempo necessario per individuare la posizione di un bug o per sperimentare una funzionalità di una lingua, ad esempio) non dovrebbero essere in un controllo di versione: tenerlo fino a quando non è necessario quindi rimuoverlo semplicemente quando si esegue il commit .
I file locali che sono propri di un determinato computer possono essere conservati in un ramo.
Eviterei di tenerli solo a livello locale, poiché è troppo doloroso ripetere tutto questo quando il tuo laptop viene rubato o un virus ti costringe a reinstallare il sistema operativo (e, a proposito, scopri che l'ultimo backup è stato eseguito due anni fa) .
D'altra parte, fai attenzione con la struttura dei file: la configurazione locale è OK, fino a quando non diventa travolgente, e ti costringe a fare una singola modifica in ogni file di ciascuno dei 42 sviluppatori che partecipano al progetto.
Controlla l'opportunità di rimuovere le particolarità tra le macchine. Può significare:
Dare accesso a un server SQL dev per sostituire le istanze locali sui computer degli sviluppatori,
Utilizzando servizi di distribuzione di pacchetti come Pypi o npm per i pacchetti pubblici e le loro controparti private per i pacchetti interni,
Chiedi ai membri del team di installare le stesse versioni di software,
Rendi gli aggiornamenti del software il più trasparenti possibile,
O rendere possibile distribuire il sistema operativo e il software necessario su una macchina in un solo clic (più il tempo per ogni sviluppatore di installare il suo Vim preferito rispetto a Emacs, Chrome vs Firefox, ecc.)
Così:
File di progetto. Potrebbe essere necessario modificare i percorsi per riflettere il layout sul PC corrente.
Perché non usare lo stesso layout su tutti i PC? I percorsi all'interno del progetto dovrebbero essere relativi al file di progetto, il che significa che non importa dove si trova il progetto. Le versioni di software e librerie sono meglio essere le stesse per evitare bug criptici che compaiono solo su alcune macchine e che sono impossibili da riprodurre per altri membri del team.
Esempio:
In un progetto creato con Visual Studio, è possibile trovare:
I file stessi. I percorsi sono relativi, non importa se sulla mia macchina, il progetto si trova H:\Development\Hello World Project\
mentre altri membri del team hanno verificato il progetto C:\Work\HelloWorld\
.
Le dipendenze, ovvero librerie di terze parti e interne. Entrambi i tipi dovrebbero essere gestiti da NuGet che rende obsolete tutte le discussioni relative ai conflitti. Se non hai la stessa versione della mia libreria, chiedi a NuGet di aggiornare le dipendenze. Semplice come quello (quando funziona bene, che non è sempre il caso).
Si noti che è fondamentale mantenere anche le librerie interne in un NuGet privato. Avere un mucchio di librerie archiviate in una cartella condivisa o inviate via e-mail a un team porta all'anarchia e ai server CI depressivi.
Le impostazioni. È fondamentale che il team condivida le stesse impostazioni. Se metà del team decide di considerare gli avvisi come errori e metà del team mantiene gli avvisi così come sono, i membri della prima parte del team impiegheranno il loro tempo a rimuovere gli avvisi generati dagli sviluppatori dalla seconda parte del team.
Le impostazioni relative alle utility. Questi sono difficili, perché alcuni membri del team potrebbero aver installato alcuni programmi di utilità, mentre altri no.
Si consiglia vivamente di installare lo stesso set di strumenti. Se alcuni programmatori vogliono usare StyleCop, ma altri no, il team non farà il lavoro. Se alcuni usano contratti di codice ma altri no, avranno gli stessi problemi.
Makefiles. Ad esempio, potrebbe essere necessario disattivare l'ottimizzazione durante il debug, ma non per il server CI.
Mantieni più makefile nel controllo versione. Non è insolito creare una versione di debug anche sul server CI e inviarla a un client che presenta un bug difficile.
Trucchi brutti e sporchi. Ad esempio, restituire 7 nel mezzo di una funzione, al fine di testare qualcosa, a seconda della funzione, e si sospetta che si interrompa al valore di 7.
Vorrei evitare tale codice in primo luogo. Per testare qualcosa, usa i test unitari. Se ci vogliono davvero alcuni secondi per scambiare un po 'di codice con lo scopo di eseguire il debug , allora fallo, ma rimuoverai comunque questo codice in pochi minuti, quindi non è necessario impegnarlo.
Mentre lo descrivi, dovresti scrivere un test. Ad esempio, se vuoi essere sicuro che:
class TemperatureConverter
{
public int CelsiusToFahrenheit(int temperature)
{
...
}
}
genera un'eccezione quando temperature
è inferiore a AbsoluteZero
costante, non si dovrebbe giocare con il codice stesso. Invece, crea un test unitario che:
- autocompensare il tuo codice,
- aumentare l'affidabilità del tuo codice,
- assicurarsi che i manutentori possano fare affidamento sul test di regressione durante la modifica del metodo sopra riportato,
- servire ad altri sviluppatori del tuo team che potrebbero aver bisogno di fare lo stesso test.