Sommaire
Pour moi, le seul moyen fiable de versionner un logiciel est d'utiliser l' identifiant de hachage ou de changeset de votre système de contrôle de version.
Un numéro de version de build global peut être utile, mais il n'est vraiment garanti d'être unique que si vous avez un serveur de build et / ou que vous signez chaque version. Pour beaucoup d'entre nous, ce n'est tout simplement pas viable.
Si votre projet est réparti sur plusieurs référentiels de contrôle de version, vous devrez également créer un mécanisme grâce auquel votre interface utilisateur pourra interroger chaque référentiel dépendant et signaler son hachage à l'utilisateur.
Exemple d'expérience personnelle
Dans un projet chez un employeur précédent, où nous avons eu des problèmes avec notre logiciel (interne) de modification de client et de recompilation, j'ai institué un processus par lequel les hachages mercuriels étaient compilés dans chaque application et bibliothèque. Chaque fois que le logiciel était démarré, une chaîne de révision était créée en interrogeant tous les composants logiciels.
Cette chaîne de révision s'affichait lorsque vous alliez à la page À propos et était écrite dans le fichier journal à chaque démarrage de l'application. C'était de la forme:
Application name (6a72e7c61f54)
Library1 (b672a13a41e1)
Library2 (9cc35769b23a)
Library2 (9cc35769b23a)
Library3 (4e9f56a0186a+)
Library2 (9cc35769b23a)
Library4 (2e3b08c4ac76)
Library1 (b672a13a41e1)
Library2 (9cc35769b23a)
De cela, je pouvais facilement voir qu'ils avaient modifié Library3 et n'avaient pas validé ces modifications dans le référentiel, ils utilisent donc du code qui n'est pas contrôlé. Je pourrais également comparer les hachages avec mon système de test actuel, ainsi je pourrais être en mesure d'identifier qu'ils sont revenus (disons) Library1 à une version plus ancienne.
Cela signifiait que chaque fois qu'ils signalaient un bug, je pouvais toujours reconstruire exactement le code utilisé au moment où le problème s'est produit, ou à tout le moins savoir avec certitude que je ne pouvais pas reproduire la configuration.
Pour plus de détails sur le système de construction que j'ai utilisé, comment j'ai accompli cela, quels problèmes j'ai eu et ce que les gens ont suggéré de les éviter, jetez un œil à ma question Stack Overflow .
Remarque: Ce système n'est vraiment viable que si vous utilisez un système de contrôle des révisions où un hachage donné est garanti pour aboutir au même ensemble de fichiers dans votre répertoire de travail (par exemple git et mercurial) si un répertoire de travail donné peut contenir un mélange de fichiers et les répertoires de plusieurs révisions (par exemple svn), puis tous les paris sont désactivés concernant l'état du répertoire de travail et cette méthode ne fonctionnera pas du tout.