Я занят автоматизацией наших сборников, чтобы включить номер версии svn. Мы используем Delphi 2010. Я добавил событие pre-build, вызывающее командный файл, который вводит номер версии svn (считанный из файла записей в каталоге .svn) и указанный номер версии в aVersionInfo.rc, который скомпилирован с мой проект. Событие предварительной сборки выглядит следующим образом:
call SetVersionInfo.bat 6 5 4
... и командный файл (надеюсь, кто-то найдет это полезным)...
@ECHO OFF
SETLOCAL
setLocal EnableDelayedExpansion
SET _myVar=0
FOR /F %%G in (.svn\entries.) DO (
IF !_myVar! LSS 3 SET /A _myVar+=1 & SET _svn_dir_rev=%%G
)
ECHO 1 VERSIONINFO > aVersionInfo.rc
ECHO. FILEVERSION %1,%2,%3,%_svn_dir_rev% >> aVersionInfo.rc
ECHO. PRODUCTVERSION 1 >> aVersionInfo.rc
ECHO. FILEOS VOS__WINDOWS32 >> aVersionInfo.rc
ECHO. FILETYPE VFT_APP >> aVersionInfo.rc
ECHO. BEGIN >> aVersionInfo.rc
ECHO. BLOCK "StringFileInfo" >> aVersionInfo.rc
ECHO. BEGIN >> aVersionInfo.rc
ECHO. BLOCK "080904b0" >> aVersionInfo.rc
ECHO. BEGIN >> aVersionInfo.rc
ECHO. VALUE "CompanyName","COMPANY\000" >> aVersionInfo.rc
ECHO. VALUE "FileDescription","APP\000" >> aVersionInfo.rc
ECHO. VALUE "FileVersion","%1.%2.%3.%_svn_dir_rev%\000" >> aVersionInfo.rc
ECHO. VALUE "InternalName","APP\000" >> aVersionInfo.rc
ECHO. VALUE "LegalCopyright","Copyright APP\000" >> aVersionInfo.rc
ECHO. VALUE "LegalTrademarks","APP\000" >> aVersionInfo.rc
ECHO. VALUE "OriginalFilename","APP.exe\000" >> aVersionInfo.rc
ECHO. VALUE "ProductName","APP\000" >> aVersionInfo.rc
ECHO. VALUE "ProductVersion,"1\000" >> aVersionInfo.rc
ECHO. VALUE "Comments","Compiled on %date% by %username%\000" >> aVersionInfo.rc
ECHO. END >> aVersionInfo.rc
ECHO. END >> aVersionInfo.rc
ECHO. BLOCK "VarFileInfo" >> aVersionInfo.rc
ECHO. BEGIN >> aVersionInfo.rc
ECHO. VALUE "Translation", 0x0809 1200 >> aVersionInfo.rc
ECHO. END >> aVersionInfo.rc
ECHO. END >> aVersionInfo.rc
ENDLOCAL
Пакетный файл выполняет как часть компиляции, обновляется aVersionInfo.rc, aVersionInfo.res перекомпилируется, но по какой-то причине новый файл res не используется для компиляции exe. Тем не менее, он обновляется во время чистой сборки или если я компилирую второй раз. Кажется, проверка изменений в файлах rc происходит до того, как вызываются события "pre" -build. Что на самом деле делает его событием средней сборки. Или я чего-то не хватает?
Я попытался удалить файл aVersionInfo.res в качестве другого события предварительной сборки, но затем компилятор жалуется, что этот файл отсутствует. Может быть,
{$R 'aVersionInfo.res' 'aVersionInfo.rc'}
строка не в том месте?