#visual-studio-2010 #svn #build #revision
#visual-studio-2010 #svn #сборка #пересмотр
Вопрос:
Ребята,
Я использую VS2010 и пытаюсь синхронизировать версию сборки моего проекта с моим репозиторием Subversion, используя SubWCRev. Все это работает правильно, но я не могу до конца разобраться в одной вещи. Мой файл шаблона состоит из этого :
#define MAJOR_VERSION 2
#define MINOR_VERSION 2
#define MICRO_VERSION 0
#define BUILD_VERSION $WCMODS?$WCREV$ 1:$WCREV$$
#define QUOTE_(x) #x
#define QUOTE(x) QUOTE_(x)
#define BUILD_VERSION_STRING QUOTE(MAJOR_VERSION.MINOR_VERSION.MICRO_VERSION.BUILD_VERSION)
Затем в моем приложении.RC-файл, который у меня есть :
FILEVERSION MAJOR_VERSION,MINOR_VERSION,MICRO_VERSION,BUILD_VERSION
PRODUCTVERSION MAJOR_VERSION,MINOR_VERSION,MICRO_VERSION,BUILD_VERSION
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x4L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "080004e4"
BEGIN
VALUE "FileVersion", BUILD_VERSION_STRING
VALUE "ProductVersion", BUILD_VERSION_STRING
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x800, 1252
END
END
Как вы, вероятно, можете догадаться, я пытаюсь увеличить версию сборки на 1, если есть измененный код, чтобы версия сборки в EXE-файле соответствовала номеру редакции Subversion при выпуске и проверке кода. Проблема в том, что BUILD_VERSION расширяется до x 1 или x 0, которые затем отображаются в BUILD_VERSION_STRING как «2.2.0.227 1», что не совсем то, что я предполагал.
Знает ли кто-нибудь, у кого немного больше опыта в этом, способ достижения моей цели? Заранее спасибо
Ответ №1:
#define BUILD_VERSION $WCMODS?$WCREV 1$:$WCREV$$
Ответ №2:
В моей группе мы автоматизируем обновление только наименее значимого значения с номером редакции svn для рабочего каталога проектов. Для этого мы добавили этап предварительной сборки к каждому проекту, который создает, а затем вызывает пакетный скрипт, который выполняет следующее:
- Скопируйте $(ProjectDir)PropertiesAssemblyInfo.cs в $(ProjectDir)PropertiesAssemblyInfo.cs.template.
- Найдите AssemblyVersion(«X.Y.Z.ddd») в свойствах $(ProjectDir)AssemblyInfo.cs.template и замените на AssemblyVersion(«X.Y.Z.$WCREV$»).
- Найдите AssemblyFileVersion(«X.Y.Z.ddd») в свойствах $(ProjectDir)AssemblyInfo.cs.template и замените на AssemblyFileVersion(«X.Y.Z.$WCREV$»).
- Запустите ‘SubWCRev $(ProjectDir) $(ProjectDir)PropertiesAssemblyInfo.cs.template $(ProjectDir)PropertiesAssemblyInfo.cs’
Ответ №3:
Если вы используете subwcrev для генерации неверсионного заголовка из вашего версионного шаблона, то #include
неверсионный заголовок в вашем версионном шаблоне будет .RC-файл, который вы можете создать для выпуска из неизмененной рабочей области.
Тогда вы можете просто использовать
#define BUILD_VERSION $WCREV$
Это также устраняет риск любых изменений, возникающих в промежутке между сборкой вашего выпуска EXE и проверкой кода.
Комментарии:
1. Да, это именно то, что я делал. Проблема / раздражение при выполнении этого заключается в том, что если вы проверяете код, а затем выполняете сборку для выпуска, то сам процесс выполнения сборки изменяет файл .rc и помечает его как измененный, потому что BUILD_VERSION изменился. Эта проблема возникла у меня некоторое время назад, и я так и не нашел удовлетворительного решения. Я думаю, вам просто нужно решить, какой способ работать, и придерживаться его и сопутствующих ему особенностей — либо сначала сборка, затем регистрация, либо сначала регистрация, затем сборка.
2. Я поместил
#include "buildversion.h"
в RC-файл
Ответ №4:
Не могли бы вы сделать что-то вроде:
#define MOD_VERSION $WCMODS?1:0$
#define REVISION $WCREV$
#define BUILD_VERSION ( REVISION MOD_VERSION )
Редактировать: это также не сработает, как указано в комментариях!
Какова цель вашего номера версии? Если вы хотите вернуться к исходному коду, используемому для создания двоичного файла, то здесь вы, возможно, немного ошибаетесь. Что произойдет, если кто-то добавит еще немного кода в репозиторий одновременно с тем, как вы создаете свой номер версии? В конечном итоге ваш двоичный файл будет ссылаться на другой код.
Возможно, было бы лучше проверить, имеет ли рабочая копия какие-либо модификации или смешанные ревизии, и использовать определенный номер редакции (например, 0xFFFFFFFF
или 0
) для представления этого. И используйте только истинный номер редакции, если вы использовали чистое дерево для сборки двоичного файла.
#define MAJOR_VERSION 2
#define MINOR_VERSION 2
#define MICRO_VERSION 0
#if $WCMODS?1:0$
#define BUILD_VERSION 0
#else
#define BUILD_VERSION $WCREV$
#endif
Комментарии:
1. Это делает точно то же самое, потому что расширяет макрос, но не оценивает его, поэтому моя BUILD_VERSION_STRING становится «2.2.0.( 227 1 )».
2. Да, вы правы. Я не уверен, что есть какой-либо способ оценить вычисления препроцессора во время компиляции. Возможно, вам потребуется использовать глобальную переменную, если это возможно.
3. Спасибо за вашу помощь, Ник. Причина, по которой я хочу это сделать, заключается в том, что над этим проектом буду работать только я, поэтому нет опасности, что кто-то другой что-то испортит при проверке. У меня есть процедура, которой я неукоснительно следую при создании релизов — сборка EXE, сборка установщика, проверка кода. Делая это, я всегда могу вернуться к коду, который создал релиз, вернувшись к этой редакции. Возможно, это не лучший способ в мире, но вы правы.