2009-04-25 1 views
12

Скажем, у меня есть проект на C++, который создает exe или dll-файл. Проект проверяется в репозитории SVN. Я хочу автоматически синхронизировать ревизию с SVN с ресурсом версии, встроенным в файл exe/dll, то есть версия должна быть чем-то вроде $ major. $ Minor. $ Svn_revision.
Любые идеи о том, как достичь этого? Есть ли готовые решения?Как синхронизировать версии SVN и версии rexources файлов EXE/DLL?

ответ

11

Если у вас установлен TortoiseSVN, то с ним установлена ​​программа, SubWCRev.

Если в вашем файле, то есть это значение:

$WCREV$ 

Тогда он будет заменен с наибольшим количеством зафиксированной ревизии, если выполнить что-то вроде этого:

SubWCRev .\ yourfile.txt.template yourfile.txt 

Это будет скопируйте с yourfile.txt.template, выполните замены и напишите на yourfile.txt.

Обратите внимание, что есть много других макросов, которые вы можете использовать, если вы выполните SubWCRev без каких-либо аргументов, он перечислит их все на консоли.

+4

SubWCRev также доступен отдельно для тех, кто не хочет (хочет) использовать TortoiseSVN: http://sourceforge.net /project/showfiles.php?group_id=138498&package_id=281312 – Stefan

+0

Круто, я этого не знал! –

+0

хорошо, это мой факт на день :) –

2

Возможно, вы захотите изучить Subversion Properties и Subversion Keywords. Они не решают проблему ресурсов, так как они всегда включают эту проклятую часть $KeywordName: ...$ . Пользовательские свойства предоставляют хороший метод для создания метаданных в пакетных файлах, а что нет.

В любом случае, я искал решение проблемы с ресурсами несколько лет назад и не нашел его. Итак, мы создали собственное домашнее решение. Мы изменили наш файл RC, чтобы включить заголовочный файл, который был сгенерирован во время процесса сборки. RC зависел от заголовка, а заголовок имел собственное правило сборки, которое вызывало командный файл для генерации заголовка. Следующий фрагмент будет извлекать текущую ревизию с вывода svn info.

SET rootdir=%1 
SET svnrev=0 
PUSHD "%rootdir%" 
FOR /F "tokens=1-4 delims=: " %%I IN ('svn info') DO (
    IF /I {%%I}=={rev} SET svnrev=%%L 
) 
(ECHO./* 
ECHO. * version-stamp.h - repository version information 
ECHO. */ 
ECHO.#ifndef VERSION_STAMP_H 
ECHO.#define VERSION_STAMP_H 
ECHO.#define REPOSITORY_VERSION %svnrev% 
ECHO.#endif) > include\version-stamp.h 
POPD 

Затем мы создали компонент конкретной версии штамповку заголовка с именем component-info.h, который выглядел что-то вроде:

#ifndef component_info_h 
#define component_info_h 
#include "product-info.h" 
#include "version-stamp.h" 

#define VERS_MAJOR 1 
#define VERS_MINOR 2 
#define VERS_PATCH 3 
#define VERS_BUILD REPOSITORY_VERSION 

#define MY_COMPONENT_NAME "TPS Report Generator"  
#define MY_VERSION_NUMBER VERS_MAJOR,VERS_MINOR,VERS_PATCH,VERS_BUILD 
#define MY_VERSION_STRING VERSION_STRING(VERS_MAJOR,VERS_MINOR,VERS_PATCH,VERS_BUILD) 

#endif 

Наконец, мы имели продукт строки версии файла, который определил информацию о продукте по имени product-info.h:

#ifndef product_info_h 
#define product_info_h 

#define PROD_VERS_MAJOR 0 
#define PROD_VERS_MINOR 1 
#define PROD_VERS_PATCH 0 
#define PROD_VERS_BUILD 0 

#define VSTR1(s) #s 
#define VSTR(s) VSTR1(s) 
#define VERSION_STRING(a,b,c,d) VSTR(a) "." VSTR(b) "." VSTR(c) "." VSTR(d) "\0" 

#define MY_COMPANY_NAME   "IniTech\0" 
#define MY_COPYRIGHT   "Copyright ©2009 " MY_COMPANY_NAME 
#define MY_PRODUCT_NAME   "\0" 
#define MY_PRODUCT_VERSION_NUM PROD_VERS_MAJOR,PROD_VERS_MINOR,PROD_VERS_PATCH,PROD_VERS_BUILD 
#define MY_PRODUCT_VERSION_STR VERSION_STRING(PROD_VERS_MAJOR,PROD_VERS_MINOR,PROD_VERS_PATCH,PROD_VERS_BUILD) 
#endif 

Затем ваш файл ресурсов содержит component-info.h и использует различные определения в соответствующем файле асы (например, FILEVERSION MY_VERSION_NUMBER). Эта структура дала нам большую гибкость и прослеживаемость во всем типе штампа. Он вырос из простого куска в пакетном файле в это многоуровневое чудовище, но он работал очень хорошо для нас в течение последних нескольких лет.

Мне трудно поверить, что никто не нашел лучшего способа сделать это еще. Опять же, я не исследовал его в течение ряда лет. Я бы предположил, что вы можете добавить пользовательский файл .rules, который определяет настраиваемый инструмент, который обрабатывает это.

3

Это отличная помощь, спасибо. Я уточнил это для Visual Studio 2008, если это кому-то поможет.

1/Создано/Построить папку в рамках каждого проекта

2/переписанные AssemblyInfo.cs в папку сборки как AssemblyInfo.cs.txt, установите Build Action "Нет"

3/Edited AssemblyInfo.cs.txt иметь версию атрибуты, как показано ниже:

[assembly: AssemblyVersion("2.0.0.$WCREV$")] 
[assembly: AssemblyFileVersion("2.0.0.$WCREV$")] 

4/Добавлены следующие к событиям Prebuild:

SubWCRev $(SolutionDir) $(ProjectDir)\Build\AssemblyInfo.cs.txt $(ProjectDir)\Properties\AssemblyInfo.cs 

Это работает каждый раз, когда вы скомпилируете.

Я использую VisualSVN/TortoiseSVN и VisualSVN сервера с Visual Studio 2008.

UPDATE:

Мой коллега только что обновил рабочую копию и AssemblyInfo.cs находится в противоречии. Кажется очевидным. Я исключил его из SVN с помощью VisualSVN, чтобы решить эту проблему.

3

Ответ от Program.X отлично работает. Я хотел бы добавить, однако, что если вы создадите свой исполняемый файл перед выполнением изменений, то ревизия будет на один меньше фактического номера версии запущенного кода. Чтобы это исправить, можно установить версии для

"2.0.$WCREV$.$WCMODS?1:0$" 

Это поставит 1 на конце, если есть какие-либо локальные изменения, и 0, если нет. Поэтому, если вы посмотрите на свой исполняемый файл позже и посмотрите 2.0.54.1, вы знаете, что это, вероятно, фактически версия 55.

+0

Подробнее о ключевых словах, доступных в WCREV, можно здесь: http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-subwcrev-keywords.html –

+0

Хорошая точка. Я заметил, что это хороший способ обмануть это. –

+1

Мне это нравится, так как вы можете увидеть, действительно ли версия представляет собой сборку содержимого SVN 1: 1 или модифицированную сборку. – Stiefel

 Смежные вопросы

  • Нет связанных вопросов^_^