我正忙于自动化我们的构建以包含 svn 修订号。我们使用的是 Delphi 2010。我添加了一个预构建事件,该事件调用一个批处理文件,该文件将 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。但是,它会在干净构建期间或我第二次编译时更新。似乎在调用“pre”-build 事件之前检查对 rc 文件的更改。这实际上使它成为一个中期构建事件。还是我错过了什么?
我确实尝试将 aVersionInfo.res 文件作为另一个预构建事件删除,但随后编译器抱怨该文件丢失。难道是
{$R 'aVersionInfo.res' 'aVersionInfo.rc'}
线是在错误的地方?