我正在忙于自动化我们的构建以包含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'}
行是在错误的地方?
答案 0 :(得分:9)
尝试使用
{$R aVersionInfo.res}
并从批处理文件中手动调用brcc32 aVersionInfo.rc
(完成创建.rc文件后)。这样,您的.res文件应该从正常的IDE构建中排除。
答案 1 :(得分:1)
可能缺少[“]
回声。 VALUE“ProductName”,“APP \ 000”>> aVersionInfo.rc
ECHO。 VALUE“ProductVersion”,1 \ 000“>> aVersionInfo.rc
-------这里----------------------- ^
回声。 VALUE“评论”,“按%用户%%000编制%日期%”>> aVersionInfo.rc
再见
答案 2 :(得分:0)
在批处理文件中添加一行,修改包含资源的Delphi源文件:
touch VersionInfo.pas
然后应该重新编译源文件。如果未修改源文件,则编译器没有理由重新链接该程序的该部分,因此不会注意到更新的资源文件。
答案 3 :(得分:0)
您可以在批处理文件中调用brcc32,这样它将始终更新.res文件。我做了类似的事情,它在编译和构建中都有效。
答案 4 :(得分:0)
TL; DR:
将行{$R 'aVersionInfo.res' 'aVersionInfo.rc'}
直接放在程序语句一次下面,然后构建。或者使用BRCC32强制第一次构建.RES文件
长版:
你的猜测就行了:
{$R 'aVersionInfo.res' 'aVersionInfo.rc'}
位置错误部分正确。
当我最初使用Delphi XE2下的.RC文件进行设置时,我遇到的问题略有不同,有时会进行编译,有时则不会。我尝试了类似的变体:
{$R 'aVersionInfo.res' 'aVersionInfo.rc'}
{$R '.\aVersionInfo.res' '.\aVersionInfo.rc'}
但是XE2编译器一直抱怨没有找到RES文件,如果它确实不存在(注意这是我的初始构建)。
事实证明,您首先必须将该行直接放在 Program 语句的下方:
program TTClient;
{$R 'VersionInfo.res' 'VersionInfo.rc'}
...而不是在您已经存在的
附近{$R *.res}
然后您构建一次程序。
之后,您可以将线路移回更合理的位置:
{$R *.res}
{$R 'VersionInfo.res' 'VersionInfo.rc'}
出于一些奇怪的原因,一旦德尔福知道' .rc文件是项目的一部分,如果您要么:
,则不再重要无需预编译步骤。如果.RC文件被修改,编译器将重建.RES文件,无论是否存在早期版本。
这种奇怪的行为在您最初设置此系统时并没有真正帮助; - (
对项目源的解析和.dproj文件的构建还有其他一些奇怪的事情,这使我得到了这个解决方案,特别是:
如果你重命名.rc文件,这可能会让你再次遇到麻烦:.dproj文件中的残余仍然指向旧的.rc文件,编译器会抱怨找不到它。您必须从.dproj文件中编辑此旧名称才能解决此问题。
请注意,这完全在XE2下,在其他版本YMMV下。
编辑添加:您可能仍然需要与XE2 Version Info Not Working问题作斗争。