Резюме
Для меня единственный надежный способ версии программного обеспечения - использовать хеш или идентификатор набора изменений из вашей системы контроля версий.
Общий номер версии сборки может быть полезен, но он действительно гарантированно будет уникальным, если у вас есть сервер сборки и / или вы подписываете каждую версию. Однако для многих из нас это просто нежизнеспособно.
Если ваш проект разделен на несколько репозиториев с контролем версий, вам также необходимо создать механизм, с помощью которого ваш пользовательский интерфейс может запрашивать каждый зависимый репозиторий и сообщать о хэше пользователю.
Пример из личного опыта
В проекте предыдущего работодателя, где у нас были проблемы с нашим (внутренним) клиентом, изменяющим программное обеспечение и перекомпилирующим его, я инициировал процесс, в результате которого ртутные хеши были скомпилированы в каждое приложение и библиотеку. Всякий раз, когда программное обеспечение было запущено, строка изменений создавалась путем запроса всех компонентов программного обеспечения.
Эта строка редакции отображалась при переходе на страницу about и записывалась в файл журнала при каждом запуске приложения. Это было в форме:
Application name (6a72e7c61f54)
Library1 (b672a13a41e1)
Library2 (9cc35769b23a)
Library2 (9cc35769b23a)
Library3 (4e9f56a0186a+)
Library2 (9cc35769b23a)
Library4 (2e3b08c4ac76)
Library1 (b672a13a41e1)
Library2 (9cc35769b23a)
Из этого я легко мог видеть, что они модифицировали Library3 и не зафиксировали эти изменения в хранилище, поэтому они используют код, который не контролируется. Я также мог бы сравнить хэши с моей текущей тестовой системой, таким образом, я мог бы определить, что они вернули (скажем) Library1 к более старой версии.
Это означало, что всякий раз, когда они сообщали об ошибке, я всегда мог перестроить именно тот код, который использовался в момент возникновения проблемы, или, по крайней мере, точно знать, что я не смог воспроизвести установку.
Для получения более подробной информации о системе сборки, которую я использовал, как я это сделал, какие у меня были проблемы и что люди предлагали избегать их, взгляните на мой вопрос переполнения стека .
Примечание. Эта система действительно жизнеспособна только в том случае, если вы используете систему контроля версий, в которой определенный хеш гарантированно приведет к тому же набору файлов в вашем рабочем каталоге (например, git и mercurial), если данный рабочий каталог может содержать смесь файлов. и каталоги из нескольких ревизий (например, svn), тогда все ставки отключены относительно состояния рабочего каталога, и этот метод не будет работать вообще.