代码之家  ›  专栏  ›  技术社区  ›  Ganesh Babu

编译前未执行Delphi预生成事件

  •  12
  • Ganesh Babu  · 技术社区  · 15 年前

    我正忙于自动化构建以包括SVN版本号。我们使用的是Delphi2010。我添加了一个预构建事件,调用一个批处理文件,将SVN修订号(从.svn目录中的entries文件中读取)和指定的版本号注入到用我的项目编译的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。但是,它是在一个干净的构建过程中更新的,或者如果我再次编译的话。在调用“预构建事件”之前,似乎要检查RC文件的更改。这实际上使它成为一个中间构建事件。还是我错过了什么?

    我确实尝试将aversioninfo.res文件作为另一个预生成事件删除,但编译器会抱怨此文件丢失。是这样吗?

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

    线路位置不对?

    5 回复  |  直到 9 年前
        1
  •  9
  •   Ondrej Kelle    15 年前

    试用使用

    {$R aVersionInfo.res}
    

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

        2
  •  1
  •   Luca Guzzon    15 年前

    可能缺少一个[“]
    回声。值“ProductName”,“app\000”>>aversionInfo.rc
    回声。值“productVersion,”1\000“>>aversionInfo.rc
    -------这里-------------------^
    回声。值“comments”,“由%username%\000在%date%编译”>>aversionInfo.rc 拜伊

        3
  •  0
  •   Rob Kennedy    15 年前

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

    touch VersionInfo.pas
    

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

        4
  •  0
  •   dummzeuch Stijn Sanders    15 年前

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

        5
  •  0
  •   Community CDub    8 年前

    TL;医生:

    放置线路 {$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'}
    

    出于某种奇怪的原因,一旦delphi“知道”了.rc文件是项目的一部分,如果您:

    • 把线放在别的地方
    • 是否存在.res文件

    不需要预编译步骤。如果修改了.rc文件,编译器将重新生成.res文件,无论是否存在早期版本。

    当您最初设置此系统时,这种奇怪的行为实际上没有帮助 ;

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

    如果您重命名.rc文件,这可能会再次给您带来麻烦:在.dproj文件中仍有一些残余文件指向旧的.rc文件,编译器会抱怨找不到它。您必须从.dproj文件中编辑此旧名称才能修复此问题。

    注意,这都是在XE2下,在其他版本下。 YMMV .


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