【问题标题】:Automatically update version info for every project in group in Delphi?在 Delphi 中自动更新组中每个项目的版本信息?
【发布时间】:2017-09-20 18:41:24
【问题描述】:

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

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

我还尝试了脚本中的正则表达式模式的变体,但无济于事。

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

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

【问题讨论】:

  • AFAIK,DDevExtensions 提供此功能:andy.jgknet.de/blog/ide-tools/ddevextensions
  • 不要。您的 IDE 没有为此做好准备。创建适当的自动化构建过程。
  • @UweRaabe 完美!如果您想添加答案,我会接受。

标签: delphi


【解决方案1】:

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

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

然后在每个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 -> .res)。我没有在几个版本中测试过这个,所以它现在可以正常工作了。由于这些问题,我的项目中还有一个预构建步骤,将我的 .rc 文件编译到 .res 文件中:

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

我不签入 .res 文件,这样 IDE 就不会抱怨新的构建。

【讨论】:

  • 谢谢你,马克!我最终使用了 Uwe 的建议,因为它更适合每个人都习惯的当前构建过程,但我会尝试使用版本文件作为当前构建过程的可能替代品。
  • 听起来你根本没有构建过程。听起来你是在 IDE 中完成的。
  • 是的。不过不是我的电话。
猜你喜欢
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
相关资源
最近更新 更多