Совет
Я бы посоветовал рассматривать номер версии с точками как маркетинговый артефакт. С тем же успехом это может быть кодовое имя, цвет или что-то еще, что позволяет быстро идентифицировать общедоступную сборку. Но есть преимущества в использовании имен, которые достаточно короткие, чтобы люди могли их запомнить, и которые также указывают на какой-то естественный порядок, чтобы люди сразу знали, что «kitkat» новее, чем «jellybean».
Добиться, чтобы ваша система контроля версий обеспечивала это каким-либо автоматизированным способом — это рецепт головной боли. А с распределенной системой управления версиями возникает дополнительная проблема, заключающаяся в том, что разным версиям может быть присвоено одно и то же имя, если они создаются в разных местах разными разработчиками и, вероятно, с разными параметрами. Вы даже не можете использовать количество сборок, потому что разные разработчики будут выполнять сборку в разное время.
Если все «официальные» сборки создаются в одной системе, вы можете использовать автоматизацию в этой системе, чтобы присвоить каждой такой сборке уникальные имена. Но как насчет портативного приложения, созданного для многих платформ, и в этом случае, вероятно, созданного на многих разных машинах?
ИМХО, единственный разумный выход - признать, что номер версии совершенно произвольный и искусственный для системы сборки.
Конечно, с точки зрения управления проектом вам необходимо иметь политику создания и назначения номеров версий и тщательно следовать этой политике.
Ветка для релизов
В fossil
одним из подходов к управлению этим является создание ветки для каждого общедоступного выпуска. В качестве одной из первых проверок в этой ветке вы меняете номер версии, отображаемый в документации, и код, чтобы он соответствовал, возможно, включая дополнительный квалификатор, такой как «альфа», «бета» или «кандидат на выпуск». По мере прохождения цикла релиза найденные ошибки могут быть исправлены в этой ветке. Между тем, функции, не запланированные к выпуску, могут разрабатываться в своих собственных ветках и/или на магистрали без риска прерывания процесса выпуска. Естественно, как только релиз сделан, его можно и, вероятно, нужно объединить обратно в основную часть, чтобы ни одно из исправлений ошибок не потерялось.
Но не закрывайте эту ветку, это дает вам логическую основу для будущего обслуживания этой выпущенной версии, позволяя легко проверить исходный код, который был основой для окончательного выпуска этой версии.
Включить UUID в релиз
Независимо от того, была ли сохранена ветвь или нет, важно включить достаточно UUID манифеста, чтобы определить, какая проверка была фактически выпущена в самом выпуске. Это может означать, что на практике никогда не следует создавать выпуск в ископаемом рабочем пространстве с какими-либо ожидающими изменениями.
Поскольку я допустил эту ошибку в своем собственном проекте, я добавил код в процесс сборки проекта, который проверяет чистоту рабочей области, а если нет, отображает громкие предупреждения и заставляет номер версии, отображаемый встроенным кодом, говорить, что сборка также не является безопасным для выпуска. Процесс также предоставляет компилятору первые несколько цифр UUID через параметр командной строки, такой как -DUUID=[0123456789]
. Этот трюк был выполнен с использованием fossil changes
для обнаружения грязного рабочего пространства и файла manifest.uuid
для предоставления UUID. UUID также можно получить от fossil info
.
Пример с Gnu Make
Makefile верхнего уровня моего проекта включает следующий код:
#
# Discover fossil checkin id and public version number
#
MANIFESTUUID := $(shell sed -e "s/\(.\{10\}\).*/\1/" manifest.uuid)
VERSIONMAJ := $(shell sed -n -e "/define VERSION_MAJ/ s/^[^0-9]*\([0-9]*\)[^0-9]*$$/\1/p" src/version.h)
VERSIONMIN := $(shell sed -n -e "/define VERSION_MIN/ s/^[^0-9]*\([0-9]*\)[^0-9]*$$/\1/p" src/version.h)
VERSIONPAT := $(shell sed -n -e "/define VERSION_PAT/ s/^[^0-9]*\([0-9]*\)[^0-9]*$$/\1/p" src/version.h)
CHECKCLEAN := $(if $(shell fossil changes),-WITH-UNCOMMITTED-CHANGES)
#
# Create a filename-friendly version string like v1.123p42 where
# exacly three digits of the minor version number are displayed.
#
VERSION := v$(VERSIONMAJ).$(shell echo 000$(VERSIONMIN) | sed -n -e s/^.*\([0-9]\{3\}\).*$$/\1/p )p$(VERSIONPAT)$(CHECKCLEAN)
Это зависит от двух файлов в ископаемом рабочем пространстве и от выходных данных команды fossil changes
для создания строки, которая может использоваться как часть имени файла выпущенного пакета, включая старший номер, младший номер, уровень исправления, и если рабочее пространство недостаточно чистое, лишний текст -WITH-UNCOMMITTED-CHANGES
. Он также помещает первые 10 символов UUID в переменную MANIFESTUUID
, откуда его можно передать в компиляцию.
В соответствии с политикой основная, второстепенная и исправленная части номера версии хранятся в файле src/version.h
и время от времени изменяются по мере выполнения работы.
person
RBerteig
schedule
04.03.2014