我有一个.groupproj
文件,用于通过构建组项目自动构建多个项目。我还增加了主要版本,并在Delphi的IDE(RAD Studio,10.1柏林)中通过Project > Options > Version Info
添加了一个新的FileDescription,但这必须手动为每个项目完成。由于新版本经常发布,因此这个手动过程变得很麻烦。是否有任何方法可以自动为组中的每个项目执行此操作?也就是说,假设组中的每个项目的新版本和文件描述都相同。
我写了bash script to do this,但它似乎不起作用。在IDE中查看... > Version Info
时,它看起来是正确的,但在查看生成的可执行文件的属性时,在Details
下,使用脚本时文件版本和文件描述不正确,但在手动完成。这很重要,因为其他软件使用此信息。
我也尝试过在脚本中找到的正则表达式模式的变体,但没有用。
我无法在自动和手动生成的版本中找到.proj
和其他元数据文件之间的任何重大差异,这些文件可以解释此问题。我无法提供它们,因为我不拥有此项目代码的权利。
除了使用宏录制器和剪贴板管理器之外,还有更好的方法吗?
答案 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就不会抱怨新版本。