Очень удобно всегда знать какой конкретно версии та или иная сборка проекта. Для этого обычно вводят номер версии, состоящий из нескольких цифр. Я являюсь сторонником структуры состоящей из 4 цифр, вида:
Именование | Смысл |
Major | Изменение этого поля указывает на то, что изменения функционала весьма существенные. Возможно даже была утрачена совместимость по файлам данных и протоколам. |
Minor | Указывает, что версия с большим значением этого поля, обладает большим функционалом. |
Patch | Значение изменяется при выпуске новых версий, которые содержат исправления. |
Build | Удобно для внутреннего использования, чтобы ссылаться на одну и ту же версию кода. |
Все вместе это и формирует полное именование версии (Major.Minor.Pathch.Build):
4.6.12.589
Некоторые используют в качестве build уникальное числовое значение, которое увеличивается каждый раз, например, при ночной сборке. Я считаю, что никакого смысла в этом нет – гораздо удобнее привязать данный номер к ревизии в репозитории. Я использую Subversion и CMake, поэтому продемонстрирую как можно автоматизировать проставлении версии билда с этими инструментами.
Первое – необходимо добавить заголовочный файл в проект (например, version.h):
#include <string> #include <boost/cstdint.hpp> namespace Version { const std::string& AsText(); boost::uint64_t AsNumber(); } |
Здесь находится простой интерфейс, через который из программы можно получить номер полной версии в текстовом виде или в виде уникального целочисленного идентификатора.
Теперь приведу содержимое version.cpp:
#include <boost/format.hpp> #include "../version.h" namespace { const boost::uint8_t MAJOR = 4; const boost::uint16_t MINOR = 6; const boost::uint16_t PATCH = 12; const boost::uint32_t BUILD = 589; // Это значение будет изменено автоматически } const std::string& Version::AsText() { static const std::string text = boost::str(boost::format("%1%.%2%.%3%.%4%") % static_cast<unsigned>(MAJOR) % MINOR % PATCH % BUILD); return text; } boost::uint64_t Version::AsNumber() { BOOST_STATIC_ASSERT(BUILD < 0xFFFFFF); using namespace boost; const size_t size = sizeof(uint64_t); static const boost::uint64_t number = (static_cast<uint64_t>(MAJOR) << (size - sizeof(MAJOR)) * 8) | (static_cast<uint64_t>(MINOR) << (size - sizeof(MAJOR) - sizeof(MINOR)) * 8) | (static_cast<uint64_t>(PATCH) << (size - sizeof(MAJOR) - sizeof(MINOR) - sizeof(PATCH)) * 8) | BUILD; return number; } |
Здесь все тривиально и, думаю, не требует комментариев. Последнее, что осталось – механизм изменения значения BUILD, на номер ревизии в репозитории. С этим отлично справится CMake, просто добавьте в CMakeLists.txt следующий код:
set (VERSION_FILE ../common/sources/version.cpp) find_package (Subversion REQUIRED) Subversion_WC_INFO (${PROJECT_SOURCE_DIR} Repo) file (READ ${VERSION_FILE} OLD_CODE) foreach (LINE ${OLD_CODE}) string (REGEX MATCH "BUILD = ([0-9]+)" BUILD_NUMBER ${LINE}) if (BUILD_NUMBER) string (REGEX REPLACE "[0-9]+$" ${Repo_WC_REVISION} LINE ${LINE}) endif () set (NEW_CODE ${NEW_CODE} ${LINE}) endforeach (LINE) file (WRITE ${VERSION_FILE} "${NEW_CODE}") |
Единственная тонкость в скрипте в последней строке, а конкретней – кавычки в "${NEW_CODE}", без них будут убраны все “;”.
Версия программы — настолько распространенная и обыденная вещь, что немного странно отсутствие в интернете вменяемой информации об автоматизации этого процесса…
P.S. Максим, кинул вам на почту немного своего опыта по решению этой проблемы. Содержимое довольно весомое, чтобы выкладывать его в комментарии. Проведите литературную обработку и добавьте в статью. Думаю, будет не лишним.
Александр
29 июня 12 16:05
Спасибо, интересная информация.
Максим Тремпольцев
30 июня 12 10:00
Одна незадача со скриптом — привязан на Subversion и предполагает, что все изменения заккомитены.
Во время повального увлечения Git-ом, нужно либо задавать BUILD_NUMBER из командной строки, либо делать его из текущего времени.
Sergei Nikulov
29 мая 13 22:36
А зачем boost здесь? Со стандартной библиотекой шаблонов (STL) не получается?
McAaron
16 ноября 13 14:00
Скриптование на cmake лично мне не очень нравится, правда иногда сталкиваюсь. Но более красивое решение думается configure_file
Konstantin Burlachenko
12 января 16 3:16
Спасибо
Denis
29 августа 17 16:39
Приветствуем вас
Предлагаем свежую базу данных действующих фирм России с большой достоверностью для телефонных продаж или электронных рассылок.
С этой базой предприятий ваша компания привлечет много новых клиентов которые нужны вашей компании и вы увеличите свою прибыль.
Понравилось предложение?
Купить базу можно на нашем сайте http://bdtop.club
topbase
28 января 20 8:46
I visit each day a few sites and blogs to read articles or reviews, except this blog gives feature based content.
shoulder posture brace
20 марта 20 15:54
Looking for a platform to create a dating site — Interested in any options
Alenx Groonwold
20 октября 20 16:04
«Julia’s Garland» (fr. Guirlande de Julie)
Furrionvfe
11 января 21 21:33
from lat. manus — «hand» and scribo — «I write») [1]
Feederqin
18 января 21 8:52
Many calligraphers have acquired
Securityjel
21 января 21 16:51
antiquities. These are the Egyptian papyri
Blendercyy
4 февраля 21 5:07
Since the era of Charlemagne
Plasticzzp
7 февраля 21 8:59
among them acquired «Moral
Seriesyjs
9 апреля 21 20:08
Century to a kind of destruction:
iAquaLinkekl
14 апреля 21 9:04
Лучшее HD видео — https://porn0hd.online
WienSceni
10 мая 21 22:32
book about the chess of love «, created by
Zodiacshn
5 июля 21 22:27
(palimpsests). In the XIII-XV centuries in
Sandervaf
15 июля 21 16:17
XVII century was Nicholas Jarry [fr].
Securitytzb
6 августа 21 23:59
XVII century was Nicholas Jarry [fr].
Speakerpyv
19 августа 21 13:57
bride, Julie d’Angenne.
Vortexrkg
24 августа 21 21:35
XVII century was Nicholas Jarry [fr].
Visionclb
10 сентября 21 5:34
Europe, and in Ancient Russia
Squierbfd
18 октября 23 4:53
awd4zw
Get free iPhone 15: https://furiousbyte.com/uploads/go.php hs=e8796b20904077dc7ed960ed4467b6e5*
11 ноября 23 15:03
consists of the book itself
Nespressoxgt
14 февраля 24 2:34
Блекспрут Darknet — это инновационный сервис, обеспечивающий полную confidentiality для своих клиентов. бренд «Blacksprut» символизирует доступ к обширным способностям и уникальным offers. Этот portal позволяет вам проникнуть в реальность secret sources и proposals, недоступных в обычной system. Здесь не существует rules и запретов, все
блэкспрут onion
Ramonglava
23 июля 24 19:31
В мире bs2site ваш запрос может быть удовлетворен без лишних вопросов и посторонних внимания. Независимо от того, что вы looking for, здесь найдется space для каждой загадки и каждой желанной шанса. секретные предложения, underground services — все это доступно на этой secret platform. Путешествие в темную сторону сети — это ваш пропуск в мир
вход на blacksprut
Josephacing
23 июля 24 19:44