Автоматическая нумерация версий

Я добавляю функциональность для своего исполняемого файла, чтобы запустить его с аргументом -version. Проект очень большой и использует несколько классов. Я хотел бы распечатать версии всех классов.

В настоящее время каждый из моих классов имеет функцию static void print_info() { cout << "information here" << endl; } и файл с main() вызывает print_info для каждого класса.

Вопрос: Есть ли способ автоматически обновить номер версии с изменениями?

Дополнительная информация: Я и моя команда используют NetBeans для разработки. Мы также используем Subversion (svn), и я знаю, что он содержит номера ревизий. Проблема только косвенно связана с номером ревизии. Я хочу иметь возможность распространять исполняемый файл, который будет печатать номер версии без доступа к серверу subversion.

Я буду рад предоставить дополнительную информацию, если это несколько расплывчато. Спасибо!

P.S. Меня не волнует, что такое значение версии. Погода - это произвольное число, сгенерированное NetBeans, или соответствующий номер ревизии подведомственности, или просто дата, когда была произведена последняя модификация.

3 ответа

Во-первых, я рекомендую вам сделать что-то другое, чем ваш подход print_info(), поскольку он не очень гибкий - что, если вы хотите фактически использовать версию, а не просто печатать ее в STDOUT, или что, если вы хотите сообщить версии в сообщении об ошибке для STDERR? Метод static, возвращающий строку const char, будет более универсальным.

Что касается выбора номера версии, вы можете использовать ключевые слова SVN, которые могут быть заменены в тело вашего кода. Например (если следовать приведенным в приведенной ссылке примерам), если у вас есть строка

char[] versionString = "commit revision $Rev$";

и включите соответствующую замену ключевых слов svn propset svn:keywords "Rev" file.cpp, при следующем обновлении ваш SVN-клиент обновит текст до чего-то вроде

char[] versionString = "commit revision $Rev: 12 $";

и в следующий раз, когда вы его зафиксируете, строка будет перезаписана в новую правильную строку, например

char[] versionString = "commit revision $Rev: 13 $";

Если вы хорошо используете SVN, вы должны быть ветвлением и тегами, и в этом случае информация о ветке и теге (которая является частью ключевого слова $URL$) является полезной для включения в вашу строку версии. $Revision$ также полезен для предоставления вам значения, которое изменяется между обновлениями. Помните, однако, что ключевые слова обновляются только при выполнении обновления (проверка, фиксация и т.д.). Если вы внесете изменения в свой код и затем скомпилируете его, сообщенный $Revision$ будет таким же, как при первоначальном извлечении кода. Насколько мне известно, единственный способ избежать этого заключается в том, чтобы принять процедуру выполнения фиксации вашего кода перед компиляцией новой версии вашего программного обеспечения - это хорошо работает, если вы объедините его с процессом пометки выпусков внутри SVN.


В исходном файле вы можете использовать свойство subversion Revision, которое активирует замену ключевого слова $Revision$ в файле.

string version = "$Revision:$";

http://svnbook.red-bean.com/en/1.4/svn.advanced.props.special.keywords.html


Если вы хотите сделать это, я бы пошел на #define при попрошайничестве каждого исходного файла и обновил его датой последней модификации файла (используя $Date: $или обновив это с помощью вашего собственный script). Вы можете использовать определенную константу в print_info() очень легко.

licensed under cc by-sa 3.0 with attribution.