Immaginiamo lo strumento da riga di comando blerp gestito su git. Questo strumento ha l'opzione (nascosta) --version
che restituisce il suo version (diciamo 0.1.2
) e un altro --commit
che restituisce il numero di commit da cui è stato generato.Come gestire il numero di versione in Git?
Sia la versione che il numero di commit sono hardcoded sulla base di codice.
Ora eseguo una correzione, quindi eseguo il commit e ricostruisco il mio programma. Vedrò comunque 0.1.2
sebbene questa nuova versione differisca dalla 0.1.2 originale. Solo il commit mi dirà che non è lo stesso 0.1.2. Quel bugfix vale un numero di versione diverso?
Una soluzione è che ogni volta che si effettua un commit, aumento il numero di versione codificato (che implica di modificare sempre almeno 2 file per ogni commit). Questa è una soluzione vincolante e non funziona quando gli sviluppatori lavorano su diversi rami attivi. Se Bob funziona sulla funzione foo
dalla versione 0.1.2
e Alice funziona sulla funzione bar
dalla stessa versione. Come aumentano il loro numero di versione? Bob può usare il dispari e Alice il pari. Cosa succede se Eve funziona su una terza funzione?
Un'altra soluzione può essere quella di utilizzare i tag Git per generare automaticamente il numero di versione. Uno script può trovare il tag più vicino a partire da v
come v0.1.2
e utilizzare il nome del tag come numero di versione più le prime n cifre del commit corrente (v0.1.2 (build 4acd21)
). Funziona bene se la directory di lavoro è pulita. Si può immaginare di aggiungere un *
prima del numero di build per indicare che la directory di lavoro non è pulita. Il problema principale di questa soluzione è che se qualcuno esporta i sorgenti, non sarà in grado di creare blerp.
Quale possibile alternativa può risolvere questo problema?
Di solito, si dovrebbe evitare di mettere una versione nei file di origine. Idealmente, si avrebbe un processo di compilazione che codifica la versione nel numero di build. In questo modo la versione è indipendente dal sorgente utilizzato per costruirlo. Quel processo può quindi anche codificare l'id di commit da qualche parte, in modo da sapere sempre da dove viene creata la fonte.E per quanto riguarda la memorizzazione del numero di versione, la soluzione comune è l'utilizzo dei tag. Questo ti dà anche il vantaggio che puoi facilmente navigare per versione nel tuo repository guardando i tag. – poke
@poke Come si ottiene il numero di versione nel prodotto se si dispone di fonti esterne a SCM. Quale sarebbe la versione di 'blerp'? – nowox
Di solito, la cosa che pubblichi non è esattamente nello stesso stato di quella del controllo di versione. Quindi puoi applicare la versione nel tuo processo di compilazione come ho descritto. – poke