Se segui i miei consigli di seguito (li ho da anni), sarai in grado di:
- metti ogni progetto ovunque nel controllo del codice sorgente, purché conservi la struttura dalla directory principale del progetto in giù
- costruire ogni progetto ovunque su qualsiasi macchina, con il minimo rischio e la minima preparazione
- Costruisci ogni progetto completamente autonomo, purché tu abbia accesso alle sue dipendenze binarie (directory "libreria" e "output" locale)
- costruire e lavorare con qualsiasi combinazione di progetti, poiché sono indipendenti
- costruire e lavorare con più copie / versioni di un singolo progetto, poiché sono indipendenti
- evita di ingombrare il tuo repository di controllo del codice sorgente con file o librerie generati
Consiglio (ecco il manzo):
Definisci ogni progetto per produrre un unico deliverable principale, ad esempio .DLL, .EXE o .JAR (impostazione predefinita con Visual Studio).
Struttura ogni progetto come un albero di directory con una singola radice.
Crea uno script di compilazione automatizzato per ogni progetto nella sua directory principale che lo costruirà da zero, senza dipendenze da un IDE (ma non impedire che venga compilato nell'IDE, se possibile).
Considera nAnt per progetti .NET su Windows o qualcosa di simile in base al tuo sistema operativo, piattaforma di destinazione, ecc.
Fai in modo che ogni script di compilazione del progetto faccia riferimento alle sue dipendenze esterne (di terze parti) da una singola directory di "libreria" condivisa locale, con ogni binario di questo tipo COMPLETAMENTE identificato dalla versione: %DirLibraryRoot%\ComponentA-1.2.3.4.dll
, %DirLibraryRoot%\ComponentB-5.6.7.8.dll
.
Fai in modo che ogni script di compilazione del progetto pubblichi il deliverable principale in una singola directory di "output" condivisa locale: %DirOutputRoot%\ProjectA-9.10.11.12.dll
, %DirOutputRoot%\ProjectB-13.14.15.16.exe
.
Fare in modo che ogni script di compilazione del progetto faccia riferimento alle sue dipendenze tramite percorsi assoluti configurabili e con versione completa (vedere sopra) nelle directory "libreria" e "output", E NESSUN ALTRO.
NON lasciate MAI che un progetto faccia direttamente riferimento a un altro progetto o ai suoi contenuti - consentite solo i riferimenti ai deliverable primari nella directory "output" (vedere sopra).
Fai in modo che ogni script di compilazione del progetto faccia riferimento ai suoi strumenti di compilazione richiesti tramite un percorso assoluto configurabile e con versione completa: %DirToolRoot%\ToolA\1.2.3.4
, %DirToolRoot%\ToolB\5.6.7.8
.
Fare ogni progetto script di build contenuti fonte di riferimento da parte di un percorso assoluto relativo alla directory radice del progetto: ${project.base.dir}/src
, ${project.base.dir}/tst
(sintassi varia da strumento di compilazione).
SEMPRE richiede uno script di compilazione del progetto per fare riferimento a OGNI file o directory tramite un percorso assoluto e configurabile (radicato in una directory specificata da una variabile configurabile): ${project.base.dir}/some/dirs
o ${env.Variable}/other/dir
.
NON consentire MAI a uno script di compilazione del progetto di fare riferimento a NULLA con un percorso relativo come .\some\dirs\here
o ..\some\more\dirs
, utilizzare SEMPRE percorsi assoluti.
NON consentire MAI a uno script di compilazione del progetto di fare riferimento a NULLA utilizzando un percorso assoluto che non dispone di una directory radice configurabile, come C:\some\dirs\here
o \\server\share\more\stuff\there
.
Per ogni directory root configurabile a cui fa riferimento uno script di compilazione del progetto, definire una variabile di ambiente che verrà utilizzata per tali riferimenti.
Tentare di ridurre al minimo il numero di variabili di ambiente che è necessario creare per configurare ogni macchina.
Su ogni macchina, crea uno script di shell che definisce le variabili d'ambiente necessarie, che è specifico per QUELLA macchina (e possibilmente specifico per quell'utente, se rilevante).
NON inserire lo script della shell di configurazione specifico della macchina nel controllo del codice sorgente; invece, per ogni progetto, eseguire il commit di una copia dello script nella directory principale del progetto come modello.
RICHIEDERE che ogni script di compilazione del progetto controlli ciascuna delle sue variabili di ambiente e interrompa con un messaggio significativo se non sono definite.
RICHIEDERE che ogni script di compilazione del progetto controlli ciascuno degli eseguibili dello strumento di compilazione dipendente, i file di libreria esterna e i file consegnabili del progetto dipendenti e interrompa con un messaggio significativo se tali file non esistono.
RESISTERE alla tentazione di inserire QUALSIASI file generato nel controllo del codice sorgente: nessun risultato del progetto, nessuna fonte generata, nessun documento generato, ecc.
Se usi un IDE, genera tutti i file di controllo del progetto possibili e non eseguirne il commit nel controllo del codice sorgente (inclusi i file di progetto di Visual Studio).
Stabilire un server con una copia ufficiale di tutte le librerie e gli strumenti esterni, da copiare / installare sulle workstation degli sviluppatori e costruire macchine. Esegui il backup, insieme al tuo repository di controllo del codice sorgente.
Stabilire un server di integrazione continua (build machine) senza strumenti di sviluppo di sorta.
Considera uno strumento per la gestione delle tue librerie esterne e dei tuoi risultati, come Ivy (usato con Ant).
NON usare Maven: inizialmente ti renderà felice e alla fine ti farà piangere.
Nota che niente di tutto questo è specifico di Subversion e la maggior parte è generico per progetti mirati a qualsiasi sistema operativo, hardware, piattaforma, linguaggio, ecc. Ho usato un po 'di sintassi specifica del sistema operativo e dello strumento, ma solo a scopo illustrativo- -Spero che tradurrai nel tuo sistema operativo o strumento preferito.
Nota aggiuntiva sulle soluzioni Visual Studio: non inserirle nel controllo del codice sorgente! Con questo approccio, non ne hai affatto bisogno o puoi generarli (proprio come i file di progetto di Visual Studio). Tuttavia, trovo che sia meglio lasciare i file della soluzione ai singoli sviluppatori per crearli / utilizzarli come meglio credono (ma non controllati nel controllo del codice sorgente). Conservo un Rob.sln
file sulla mia stazione di lavoro da cui faccio riferimento ai miei progetti attuali. Poiché i miei progetti sono tutti autonomi, posso aggiungere / rimuovere progetti a piacimento (ciò significa nessun riferimento alle dipendenze basato sul progetto).
Si prega di non utilizzare gli esterni di Subversion (o simili in altri strumenti), sono un anti-pattern e, quindi, non necessari.
Quando si implementa l'integrazione continua, o anche quando si desidera solo automatizzare il processo di rilascio, creare uno script per esso. Crea un singolo script di shell che: prenda i parametri del nome del progetto (come elencato nel repository) e il nome del tag, crei una directory temporanea all'interno di una directory root configurabile, controlli l'origine per il nome del progetto e il nome del tag (costruendo il URL appropriato nel caso di Subversion) a quella directory temporanea, esegue una build pulita che esegue test e impacchetta il deliverable. Questo script di shell dovrebbe funzionare su qualsiasi progetto e dovrebbe essere inserito nel controllo del codice sorgente come parte del progetto "strumenti di compilazione". Il tuo server di integrazione continua può utilizzare questo script come base per la creazione di progetti o potrebbe persino fornirlo (ma potresti comunque volerne uno tuo).
@VonC: NON vuoi lavorare sempre con "ant.jar" invece che con "ant-abcdjar" dopo esserti bruciato quando il tuo script di build si interrompe perché lo hai eseguito inconsapevolmente con una versione incompatibile di Ant. Questo è particolarmente comune tra Ant 1.6.5 e 1.7.0. Generalizzando, vuoi SEMPRE sapere quale versione specifica di OGNI componente viene utilizzata, inclusa la tua piattaforma (Java ABCD) e il tuo strumento di compilazione (Ant EFGH). Altrimenti, alla fine incontrerai un bug e il tuo primo GRANDE problema sarà rintracciare quali versioni dei tuoi vari componenti sono coinvolte. È semplicemente meglio risolvere il problema in anticipo.