L'esperienza vinta duramente mi ha insegnato che quasi tutto appartiene al controllo del codice sorgente. (I miei commenti qui sono colorati da un decennio e mezzo in via di sviluppo per sistemi embedded / telecom su hardware proprietario con strumenti proprietari, e talvolta difficili da trovare.)
Alcune delle risposte qui dicono "non mettere i binari nel controllo del codice sorgente". È sbagliato. Quando lavori su un prodotto con un sacco di codice di terze parti e molte librerie binarie dei fornitori, controlli nelle librerie binarie . Perché, in caso contrario, a un certo punto eseguirai l'aggiornamento e potresti riscontrare problemi: la build si interrompe perché la macchina di build non ha l'ultima versione; qualcuno dà al nuovo ragazzo i vecchi CD da installare; il wiki del progetto contiene istruzioni obsolete su quale versione installare; eccetto ancora peggio, se devi lavorare a stretto contatto con il fornitore per risolvere un problema specifico e ti inviano cinque set di librerie in una settimana, deviessere in grado di tracciare quale serie di binari ha mostrato quale comportamento. Il sistema di controllo del codice sorgente è uno strumento che risolve esattamente quel problema.
Alcune delle risposte qui dicono "non mettere la toolchain nel controllo del codice sorgente". Non dirò che è sbagliato, ma è meglio mettere la toolchain nel controllo del codice sorgente a meno che tu non abbia un solido sistema di gestione della configurazione (CM) . Ancora una volta, considera il problema di aggiornamento come menzionato sopra. Peggio ancora, ho lavorato a un progetto in cui c'erano quattro diversi tipi di toolchain che fluttuavano intorno quando sono stato assunto - tutti in uso attivo ! Una delle prime cose che ho fatto (dopo che sono riuscito a far funzionare una build) è stata mettere la toolchain sotto il controllo del codice sorgente. (L'idea di un solido sistema CM era oltre ogni speranza.)
E cosa succede quando progetti diversi richiedono toolchain diversi? Caso in questione: dopo un paio d'anni, uno dei progetti è stato aggiornato da un fornitore e tutti i Makefile si sono rotti. Si è scoperto che si basavano su una versione più recente di GNU make. Quindi ci siamo tutti aggiornati. Whoops, i Makefile di un altro progetto si sono tutti rotti. Lezione: eseguire il commit di entrambe le versioni di GNU make ed eseguire la versione fornita con il checkout del progetto.
Oppure, se lavori in un posto dove tutto il resto è sfrenatamente fuori controllo, hai conversazioni come "Ehi, il nuovo ragazzo sta iniziando oggi, dov'è il CD per il compilatore?" "Non so, non li vedo da quando Jack ha smesso, era il guardiano dei cd." "Uhh, non è stato prima che salissimo dal 2 ° piano?" "Forse sono in una scatola o qualcosa del genere." E poiché gli strumenti hanno tre anni, non c'è speranza di ottenere quel vecchio CD dal venditore.
Tutti gli script di compilazione appartengono al controllo del codice sorgente. Qualunque cosa! Fino alle variabili d'ambiente. Il tuo computer di generazione dovrebbe essere in grado di eseguire una build di uno qualsiasi dei tuoi progetti eseguendo un singolo script nella radice del progetto. ( ./build
è uno standard ragionevole; ./configure; make
è quasi altrettanto buono.) Lo script dovrebbe impostare l'ambiente come richiesto e quindi lanciare qualunque strumento costruisca il prodotto (marca, formica, ecc.).
Se pensi che sia troppo lavoro, non lo è. In realtà consente di risparmiare un sacco di lavoro. Commetti i file una volta all'inizio del tempo e poi ogni volta che esegui l'aggiornamento. Nessun lupo solitario può aggiornare la propria macchina e commettere un sacco di codice sorgente che dipende dall'ultima versione di alcuni strumenti, interrompendo la creazione per tutti gli altri. Quando assumi nuovi sviluppatori, puoi dire loro di controllare il progetto ed eseguirlo ./build
. Quando la versione 1.8 ha un sacco di ottimizzazione delle prestazioni e si modifica il codice, i flag del compilatore e le variabili di ambiente, si desidera assicurarsi che i nuovi flag del compilatore non vengano accidentalmente applicati alle build della patch della versione 1.7, perché hanno davvero bisogno del codice cambiamenti che li accompagnano o vedi alcune condizioni di gara pelose.
Meglio di tutti , sarà un giorno salvare il culo: immaginate di spedire la versione 3.0.2 del prodotto su un Lunedi. Evviva, festeggia. Martedì mattina, un cliente VIP chiama la hotline dell'assistenza, lamentandosi di questo bug urgente e supercritico nella versione 2.2.6 che è stato spedito 18 mesi fa. E contrattualmente devi ancora supportarlo e si rifiutano di aggiornarsi fino a quando non puoi confermare con certezza che il bug è stato corretto nel nuovo codice e sono abbastanza grandi da farti ballare. Esistono due universi paralleli:
Nell'universo in cui non hai librerie, toolchain e build di script nel controllo del codice sorgente e non hai un sistema CM solido come una roccia .... Puoi controllare la versione corretta del codice, ma dà tutti i tipi di errori quando provi a creare. Vediamo, abbiamo aggiornato gli strumenti a maggio? No, quelle erano le biblioteche. Ok, torna alle vecchie librerie - aspetta, c'erano due aggiornamenti? Ah sì, sembra un po 'meglio. Ma ora questo strano crash del linker sembra familiare. Oh, è perché le vecchie librerie non funzionavano con la nuova toolchain, ecco perché abbiamo dovuto aggiornare, giusto? (Ti risparmierò l'agonia del resto dello sforzo. Ci vogliono due settimane e alla fine nessuno è contento, non tu, non il management, non il cliente.)
Nell'universo in cui tutto è nel controllo del codice sorgente, dai un'occhiata al tag 2.2.6, hai una build di debug pronta in circa un'ora, trascorri un giorno o due a ricreare il "bug VIP", rintraccia la causa, risolvilo in la versione corrente e convincere il cliente ad aggiornare. Stressante, ma non così grave come quell'altro universo in cui l'attaccatura dei capelli è 3 cm più alta.
Detto questo, puoi andare troppo lontano:
- Dovresti avere un'installazione standard del sistema operativo di cui hai una "copia d'oro". Documentalo, probabilmente in un README che è nel controllo del codice sorgente, in modo che le generazioni future sappiano che la versione 2.2.6 e precedenti si basano solo su RHEL 5.3 e 2.3.0 e successivamente solo su Ubuntu 11.04. Se è più facile gestire la toolchain in questo modo, provaci, assicurati solo che sia un sistema affidabile.
- La documentazione del progetto è ingombrante da mantenere in un sistema di controllo del codice sorgente. I documenti di progetto sono sempre in anticipo rispetto al codice stesso e non è raro lavorare sulla documentazione per la versione successiva mentre si lavora sul codice per la versione corrente. Soprattutto se tutti i tuoi documenti di progetto sono documenti binari che non puoi diffondere o unire.
- Se hai un sistema che controlla le versioni di tutto ciò che viene utilizzato nella build, usalo ! Assicurati solo che sia facile sincronizzare tutto il team, in modo che tutti (inclusa la macchina di costruzione) stiano tirando fuori dallo stesso set di strumenti. (Sto pensando a sistemi come il pbuilder di Debian e l'uso responsabile di virtualenv di python.)