четверг, 20 декабря 2012 г.

Автоинкремент версии в QT / С++ приложениях

Задачу инкремента номера версии при сборке релиза QT-шного проекта, естественно, хочется автоматизировать. Но есть несколько тонкостей. В своих проектах я использую два варианта именования версий:
  • Классический: 1.0.0.BUILD_NUMBER
  • Дата релиза: 2012.12.20.BUILD_NUMBER
В коммерческих приложениях, где релизы достаточно редки, удобнее первый формат. В корпоративных приложениях, где "релизы" могут собираться каждый день и файл "что нового" никто не пишет - предпочтителен второй формат.

Номер билда может генерироваться двумя способами:
  • Последовательный инкремент: 1,2,3,4...
  • Произвольная последовательность чисел: N1, N2, N3.. важно, чтобы N1 < N2 < N3. Сам по себе номер билда не важен, главное чтобы он отличался у разных релизов.


Для удобства, написал крохотную утилиту FlexBuildIncrementer, которая позволяет задавать/инкрементировать номер версии во всех перечисленных вариантах.

Вызывается утилита следующим образом:
FlexBuildIncrementer  [mode]
Здесь path - путь к файлу с номером версии. Если файла нет, он будет автоматически создан по этому пути; если есть - номер версии будет изменен согласно заданным правилам. Файл содержит одну единственную строку вида:
#define APPLICATION_VERSION "1.0.0.0" //[inc] inc, sec70, date, date_sec70
Правила инкремента версии задаются параметром [mode]. Поддерживаются четыре варианта:
  • inc: 1.0.0.1 -> 1.0.0.2
  • sec70: 1.0.0.1 -> 1.0.0.COUNT_SECONDS_SINCE_1970
  • date: 1.0.0.1 -> CURRENT_YEAR.CURRENT_MONTH.CURRENT_DAY.2
  • date_sec70: 1.0.0.1 -> CURRENT_YEAR.CURRENT_MONTH.CURRENT_DAY.COUNT_SECONDS_SINCE_1970
Пример результатов работы утилиты:
FlexBuildIncrementer.exe version 
#define APPLICATION_VERSION "1.0.0.1" //[inc] inc, sec70, date, date_sec70

FlexBuildIncrementer.exe version 
#define APPLICATION_VERSION "1.0.0.2" //[inc] inc, sec70, date, date_sec70

FlexBuildIncrementer.exe version inc
#define APPLICATION_VERSION "1.0.0.3" //[inc] inc, sec70, date, date_sec70

FlexBuildIncrementer.exe version date
#define APPLICATION_VERSION "2012.12.20.4" //[inc] inc, sec70, date, date_sec70

FlexBuildIncrementer.exe version sec70
#define APPLICATION_VERSION "2012.12.20.1355969884" //[inc] inc, sec70, date, date_sec70

FlexBuildIncrementer.exe version sec70
#define APPLICATION_VERSION "1.0.0.1355969831" //[inc] inc, sec70, date, date_sec70

FlexBuildIncrementer.exe version date_sec70
#define APPLICATION_VERSION "2012.12.20.1355969899" //[inc] inc, sec70, date, date_sec70
Можно задать режим генерации версии прямо в файле version и НЕ передавать второй параметр командной строки. Пример:
#define APPLICATION_VERSION "1.0.0.1" //[sec70] 
FlexBuildIncrementer.exe version 
#define APPLICATION_VERSION "1.0.0.1355970013" //[sec70]
Перед сборкой релиза я вызываю утилиту (через bat-файл) - и в проекте автоматически выставляется нужный номер версии. В принципе, можно автоматизировать вызов bat-файла при сборке релиза (см. топик на stackoverflow), но лично мне ручной режим удобнее.

Исходные коды FlexBuildIncrementer
Скомпилированная версия FlexBuildIncrementer: FlexBuildIncrementer.7z

Комментариев нет:

Отправить комментарий