Resumen
Para mí, la única forma confiable de versionar el software es usar el identificador hash o changeset de su sistema de control de versiones.
Un número de versión de compilación general puede ser útil, pero solo se garantiza que sea único si tiene un servidor de compilación y / o firma cada versión. Sin embargo, para muchos de nosotros, esto simplemente no es viable.
Si su proyecto se divide en múltiples repositorios de control de versiones, también necesitará crear un mecanismo mediante el cual su interfaz de usuario pueda consultar cada repositorio dependiente e informar de su hash al usuario.
Ejemplo de experiencia personal
En un proyecto de un empleador anterior, donde tuvimos problemas con nuestro cliente (interno) que modificaba el software y lo volvía a compilar, instituí un proceso mediante el cual los hashes mercuriales se compilaron en cada aplicación y biblioteca. Cada vez que se iniciaba el software, se creaba una cadena de revisiones consultando todos los componentes del software.
Esta cadena de revisión se mostró cuando fue a la página Acerca de y se escribió en el archivo de registro cada vez que se inició la aplicación. Era de la forma:
Application name (6a72e7c61f54)
Library1 (b672a13a41e1)
Library2 (9cc35769b23a)
Library2 (9cc35769b23a)
Library3 (4e9f56a0186a+)
Library2 (9cc35769b23a)
Library4 (2e3b08c4ac76)
Library1 (b672a13a41e1)
Library2 (9cc35769b23a)
A partir de esto, pude ver fácilmente que habían modificado Library3 y no habían comprometido esos cambios en el repositorio, por lo que están usando código que no está controlado. También podría comparar los hashes con mi sistema de prueba actual, por lo que podría identificar que han revertido (por ejemplo) Library1 a una versión anterior.
Esto significaba que cada vez que informaban un error, siempre podía reconstruir exactamente el código en uso en el momento en que ocurría el problema, o al menos saber con certeza que no podía reproducir la configuración.
Para obtener más detalles sobre el sistema de compilación que utilicé, cómo logré esto, qué problemas tuve y qué sugirió la gente para evitarlos, eche un vistazo a mi pregunta de desbordamiento de pila .
Nota: Este sistema solo es realmente viable si usa un sistema de control de revisión en el que se garantiza que un hash dado dará como resultado el mismo conjunto de archivos en su directorio de trabajo (por ejemplo, git y mercurial) si un directorio de trabajo dado puede contener una mezcla de archivos y directorios de varias revisiones (por ejemplo, svn), todas las apuestas están desactivadas con respecto al estado del directorio de trabajo y este método no funcionará en absoluto.