Sommario
Per me, l'unico modo affidabile per il software di versione è utilizzare l'hash hash o il changeset dal tuo sistema di controllo della versione.
Un numero di versione di build generale può essere utile, ma è davvero garantito che sia univoco se si dispone di un server di build e / o si firma ogni versione. Per molti di noi però, questo semplicemente non è fattibile.
Se il tuo progetto è suddiviso su più repository di controllo della versione, dovrai anche creare un meccanismo in base al quale l'interfaccia utente può interrogare ogni repository dipendente e riportare il suo hash all'utente.
Esempio di esperienza personale
In un progetto in un precedente datore di lavoro, in cui abbiamo avuto problemi con il nostro software (interno) che modifica il cliente e lo ricompilavo, ho istituito un processo in cui gli hash mercurial venivano compilati in ogni applicazione e libreria. Ogni volta che il software è stato avviato, una stringa di revisioni è stata creata interrogando tutti i componenti software.
Questa stringa di revisione è stata visualizzata quando si è passati alla pagina about e si è scritto nel file di log ogni volta che si avviava l'applicazione. Era nella forma:
Application name (6a72e7c61f54)
Library1 (b672a13a41e1)
Library2 (9cc35769b23a)
Library2 (9cc35769b23a)
Library3 (4e9f56a0186a+)
Library2 (9cc35769b23a)
Library4 (2e3b08c4ac76)
Library1 (b672a13a41e1)
Library2 (9cc35769b23a)
Da questo ho potuto facilmente vedere che avevano modificato Library3 e non avevano commesso tali modifiche al repository, quindi stanno usando un codice che non è controllato. Potrei anche confrontare gli hash con il mio attuale sistema di test, quindi potrei essere in grado di identificare che hanno ripristinato (diciamo) Library1 su una versione precedente.
Questo significava che ogni volta che riportavano un bug, potevo sempre ricostruire esattamente il codice in uso al momento in cui si verificava il problema, o per lo meno sapere per certo che non potevo riprodurre il setup.
Per ulteriori dettagli sul sistema di build che ho usato, su come ho realizzato questo, su quali problemi ho avuto e su cosa le persone hanno suggerito di evitarli, dai uno sguardo al mio Domanda di overflow dello stack .
Nota: questo sistema è realmente valido solo se si utilizza un sistema di controllo di revisione in cui è garantito che un dato hash produca lo stesso insieme di file nella directory di lavoro (es. git e mercurial) se una determinata directory di lavoro può contenere un mix di file e directory da diverse revisioni (es. svn) quindi tutte le scommesse sono disattivate rispetto allo stato della directory di lavoro e questo metodo non funzionerà affatto.