我们通过在我们的项目中包含一个不同的 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 就不会抱怨新的构建。