Visual Studio с проблемой автоматической сборки версий SubWCRev

#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 для рабочего каталога проектов. Для этого мы добавили этап предварительной сборки к каждому проекту, который создает, а затем вызывает пакетный скрипт, который выполняет следующее:

  1. Скопируйте $(ProjectDir)PropertiesAssemblyInfo.cs в $(ProjectDir)PropertiesAssemblyInfo.cs.template.
  2. Найдите AssemblyVersion(«X.Y.Z.ddd») в свойствах $(ProjectDir)AssemblyInfo.cs.template и замените на AssemblyVersion(«X.Y.Z.$WCREV$»).
  3. Найдите AssemblyFileVersion(«X.Y.Z.ddd») в свойствах $(ProjectDir)AssemblyInfo.cs.template и замените на AssemblyFileVersion(«X.Y.Z.$WCREV$»).
  4. Запустите ‘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, сборка установщика, проверка кода. Делая это, я всегда могу вернуться к коду, который создал релиз, вернувшись к этой редакции. Возможно, это не лучший способ в мире, но вы правы.