在Delphi中自动更新组中每个项目的版本信息?

时间:2017-09-20 18:41:24

标签: delphi

我有一个.groupproj文件,用于通过构建组项目自动构建多个项目。我还增加了主要版本,并在Delphi的IDE(RAD Studio,10.1柏林)中通过Project > Options > Version Info添加了一个新的FileDescription,但这必须手动为每个项目完成。由于新版本经常发布,因此这个手动过程变得很麻烦。是否有任何方法可以自动为组中的每个项目执行此操作?也就是说,假设组中的每个项目的新版本和文件描述都相同。

我写了bash script to do this,但它似乎不起作用。在IDE中查看... > Version Info时,它看起来是正确的,但在查看生成的可执行文件的属性时,在Details下,使用脚本时文件版本和文件描述不正确,但在手动完成。这很重要,因为其他软件使用此信息。

我也尝试过在脚本中找到的正则表达式模式的变体,但没有用。

我无法在自动和手动生成的版本中找到.proj和其他元数据文件之间的任何重大差异,这些文件可以解释此问题。我无法提供它们,因为我不拥有此项目代码的权利。

除了使用宏录制器和剪贴板管理器之外,还有更好的方法吗?

1 个答案:

答案 0 :(得分:5)

我们通过在项目中包含不同的version.res文件并关闭IDE添加的版本信息来实现此目的。这个"版本" file位于我们的项目根目录中,并被所有其他项目引用。

首先在项目设置中取消选中"在项目中包含版本信息"选项。

然后在每个dpr中添加一个自定义资源文件:

{$R ..\version.res}

我使用msbuild创建我的版本文件。它从一个模板文件开始,就像这个名为version.rc.template的文件一样。请注意,我有两个不同的替换字符串。嵌入式FILEVERSION和PRODUCTVERSION需要是逗号分隔的数字,但我也包括"。"用户看到的字符串值中的数字。

VS_VERSION_INFO VERSIONINFO
FILEVERSION $(NewCommaVersion)
PRODUCTVERSION $(NewCommaVersion) 
FILEFLAGSMASK 0x3fL
FILEFLAGS 0x0L
FILEOS 0x4L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
  BLOCK "StringFileInfo"
  BEGIN
    BLOCK "080904B0"
    BEGIN
      VALUE "FileDescription", "Product, by Company.\0"
      VALUE "FileVersion", "$(NewBuildVersion)\0"
      VALUE "InternalName", "Product.exe\0"
      VALUE "LegalCopyright", "Copyright \251 Company\0"
      VALUE "ProductName", "Product\0"
      VALUE "ProductVersion","$(NewBuildVersion)\0"
    END
  END

  BLOCK "VarFileInfo"
  BEGIN
    VALUE "Translation", 0x809,1200
  END
END

我的msbuild进程将模板文件复制到真正的version.rc文件并替换令牌。我在msbuild.proj文件中有默认值,但通常在运行构建时从命令行设置它们。

  <PropertyGroup>
    <CommaVersion>1,2,999,999</CommaVersion>  
    <BuildVersion>1.2.999</BuildVersion>
  </PropertyGroup> 

  <ItemGroup>
    <TokenValues Include="NewCommaVersion">
        <Replacement>$(CommaVersion)</Replacement>
    </TokenValues>   
    <TokenValues Include="NewBuildVersion">
        <Replacement>$(BuildVersion)</Replacement>
    </TokenValues> 
  </ItemGroup>            

  <!--===================-->
  <Target Name="SetVersion">
    <Copy SourceFiles="version.rc.template" DestinationFiles="version.rc" />  

    <MSBuild.ExtensionPack.FileSystem.Detokenise 
       TaskAction="Detokenise" TargetFiles="version.rc" 
       ReplacementValues="@(TokenValues)"
       TextEncoding="ASCII" /> 
  </Target>

最后,我无法让Delphi自动重建我的资源文件(.rc - &gt; .res)。我没有在几个版本中对此进行测试,因此它现在可以正常工作。由于这些问题,我的项目中还有一个预构建步骤,将我的.rc文件编译成.res文件:

brcc32 "$(PROJECTDIR)\..\version.rc"

我没有检查.res文件,这样IDE就不会抱怨新版本。