Delphi预构建事件未执行BEFORE编译

时间:2010-01-18 16:12:27

标签: delphi delphi-2010 pre-build-event

我正在忙于自动化我们的构建以包含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'}

行是在错误的地方?

5 个答案:

答案 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文件是项目的一部分,如果您要么:

,则不再重要
  • 将该行放在其他地方
  • 是否存在.res文件

无需预编译步骤。如果.RC文件被修改,编译器将重建.RES文件,无论是否存在早期版本。

这种奇怪的行为在您最初设置此系统时并没有真正帮助; - (

对项目源的解析和.dproj文件的构建还有其他一些奇怪的事情,这使我得到了这个解决方案,特别是:

如果你重命名.rc文件,这可能会让你再次遇到麻烦:.dproj文件中的残余仍然指向旧的.rc文件,编译器会抱怨找不到它。您必须从.dproj文件中编辑此旧名称才能解决此问题。

请注意,这完全在XE2下,在其他版本YMMV下。

编辑添加:您可能仍然需要与XE2 Version Info Not Working问题作斗争。