2010-01-18 94 views
12

我忙于自动构建包含svn修订版编号。我们使用的是Delphi 2010.我添加了一个预生成事件,调用一个批处理文件,将svn修订版号(从.svn目录中的条目文件中读取)和指定的版本号注入到aVersionInfo.rc中,我的项目。预生成事件看起来是这样的:Delphi预编译事件不会在执行之前编译

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”生成事件之前检查对rc文件的更改。这实际上使它成为中期制作活动。或者我错过了什么?

我曾尝试删除aVersionInfo.res文件作为另一个预生成事件,但编译器抱怨此文件丢失。难道是

{$R 'aVersionInfo.res' 'aVersionInfo.rc'} 

行是在错误的地方?

回答

9

尝试(您先请”重新创建.rc文件)。这样,您的.res文件应该从常规IDE版本中排除。

+0

感谢,作品像一个魅力 – 2010-01-19 07:46:27

1

可能缺少[ “]
ECHO。VALUE ”产品名称“,” APP \ 000" >> aVersionInfo.rc
ECHO。VALUE “的ProductVersion,” 1 \ 000" >> aVersionInfo.rc
------- HERE -----------------------^
ECHO。使用

{$R aVersionInfo.res} 

和手动从您的批处理文件调用brcc32 aVersionInfo.rc VALUE “注释”,>> aVersionInfo.rc 再见 “由%USERNAME%\ 000编译于%DATE%”

+0

对不起,我的错误:“包含在原文中,当我删除公司的具体信息时,它就丢失了,虽然发现它不错! – 2010-01-19 07:23:41

0

添加一行到修改,其中包括该资源的Delphi源文件的批处理文件:

touch VersionInfo.pas 

然后,将源文件应该得到重新编译。如果源文件未被修改,那么编译器没有理由重新链接该程序的那一部分,因此更新的资源文件将不会被注意到。

+0

该资源包含在我的.dpr file。如果我触摸dpr文件,它只会在编译完成后弹出更改并弹出两条消息,询问是否要重新加载.dproj文件和.rc文件。旧res文件中的版本信息仍然使用。 – 2010-01-19 07:45:54

0

您可以在批处理文件中调用brcc32,以便它将始终更新.res文件。我做了类似的事情,它可以在编译和构建中使用。

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 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争执。