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

afa*_*rah 2 delphi

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

我写了一个bash脚本来执行此操作,但它似乎不起作用.当在寻找... > Version Info它看起来是正确的IDE,但在那产生,在可执行文件的属性看时Details,当使用脚本,但正确的,当手动完成文件版本和文件的描述是不正确的.这很重要,因为另一个软件使用此信息.

我也尝试过在脚本中找到的正则表达式模式的变体,但无济于事.

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

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

Mar*_*der 5

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

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

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

{$R ..\version.res}
Run Code Online (Sandbox Code Playgroud)

我使用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
Run Code Online (Sandbox Code Playgroud)

我的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>
Run Code Online (Sandbox Code Playgroud)

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

brcc32 "$(PROJECTDIR)\..\version.rc"
Run Code Online (Sandbox Code Playgroud)

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