14

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

线是在错误的地方?

4

5 回答 5

10

尝试使用

{$R aVersionInfo.res}

并从您的批处理文件中手动调用brcc32 aVersionInfo.rc(在您完成创建 .rc 文件之后)。这样,您的 .res 文件应从正常的 IDE 构建中排除。

于 2010-01-18T18:11:29.697 回答
1

可能缺少 ["]
ECHO。VALUE "ProductName","APP\000" >> aVersionInfo.rc ECHO。VALUE
"ProductVersion,"1\000" >> aVersionInfo.rc
------- HERE - ----------------------^
回声。VALUE "Comments","由 %username%\000 于 %date% 编译" >> aVersionInfo.rc 再见

于 2010-01-18T17:17:13.580 回答
1

TL;博士:

将该行{$R 'aVersionInfo.res' 'aVersionInfo.rc'}直接放在Program语句的正下方然后构建。或使用 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'}

出于某种奇怪的原因,一旦 Delphi “知道” .rc 文件是项目的一部分,那么无论您是否:

  • 将线放在其他任何地方
  • 是否存在 .res 文件

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

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

在解析项目源代码和构建 .dproj 文件时还发生了其他奇怪的事情,这让我想到了这个解决方案,特别是:

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

请注意,这一切都在 XE2 下,在其他版本YMMV下。


编辑添加:您可能仍然需要与XE2 版本信息不工作问题作斗争。

于 2015-09-03T12:27:50.080 回答
0

在批处理文件中添加一行来修改包含资源的 Delphi 源文件:

touch VersionInfo.pas

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

于 2010-01-18T18:38:28.323 回答
0

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

于 2010-01-18T19:16:35.830 回答