Sumário
Para mim, a única maneira confiável de criar versão de software é usar o identificador de hash ou conjunto de alterações do seu sistema de controle de versão.
Um número de versão geral da compilação pode ser útil, mas só é realmente garantido que seja exclusivo se você tiver um servidor de compilação e / ou assinar cada release. Para muitos de nós, porém, isso simplesmente não é viável.
Se o seu projeto estiver dividido em vários repositórios de controle de versão, você também precisará criar um mecanismo pelo qual sua interface com o usuário possa consultar cada repositório dependente e reportar seu hash de volta ao usuário.
Exemplo da experiência pessoal
Em um projeto de um empregador anterior, onde tivemos problemas com o software de modificação do cliente (interno) e recompilá-lo, institui um processo pelo qual os hashes mercuriais eram compilados em cada aplicativo e biblioteca. Sempre que o software foi iniciado, uma sequência de revisões foi criada consultando todos os componentes do software.
Essa sequência de revisão foi exibida quando você foi para a página sobre e foi gravada no arquivo de log toda vez que o aplicativo foi iniciado. Era da forma:
Application name (6a72e7c61f54)
Library1 (b672a13a41e1)
Library2 (9cc35769b23a)
Library2 (9cc35769b23a)
Library3 (4e9f56a0186a+)
Library2 (9cc35769b23a)
Library4 (2e3b08c4ac76)
Library1 (b672a13a41e1)
Library2 (9cc35769b23a)
A partir disso, pude ver facilmente que eles haviam modificado a Library3 e não haviam confirmado essas alterações no repositório; portanto, eles estão usando código que não é controlado. Também pude comparar os hashes com o meu sistema de teste atual, para poder identificar que eles reverteram (digamos) o Library1 para uma versão mais antiga.
Isso significava que sempre que eles relatavam um erro, eu sempre podia reconstruir exatamente o código em uso no momento em que o problema ocorreu ou, no mínimo, ter certeza de que não conseguia reproduzir a instalação.
Para obter mais detalhes do sistema de compilação que usei, como consegui isso, quais problemas tive e o que as pessoas sugeriram para evitá-los, dê uma olhada na minha pergunta do Stack Overflow .
Nota: Este sistema só é realmente viável se você usar um sistema de controle de revisão em que um determinado hash tenha a garantia de resultar no mesmo conjunto de arquivos em seu diretório de trabalho (por exemplo, git e mercurial) se um determinado diretório de trabalho puder conter uma mistura de arquivos e diretórios de várias revisões (por exemplo, svn), todas as apostas estão desativadas em relação ao estado do diretório de trabalho e esse método não funciona.