VSoft Technologies博客

rss

VSoft Technologies博客——关于我们的产品和软件开发的文章。

使用FinalBuilder管理Delphi版本信息(Version Info)

在这篇文章中,我们将了解使用FinalBuilder在Delphi项目中管理和更新版本信息的各种选项。

Windows版本信息(Version Info)入门

Windows版本信息(即,资源管理器中显示的版本信息)存储在可执行内容(exe或dll)中的VERSIONINFO资源中。这些资源可以通过定义一个.rc文件来创建,还要用windows资源编译器(rc.exe)或Delphi提供的资源编译器(brcc32或cgrc,这取决于Delphi的版本)进行编译。这将产生一个.res文件,该文件可以在编译时链接到exe中,并在源代码中引用它,例如:

1
{$R 'myresource.res'}

我强烈建议您熟悉VERSIONINFO资源类型及其组成部分。

Delphi IDE对版本信息(Version Info)的支持

当您创建新项目时,Delphi IDE会在dpr或dpk旁创建一个[YourProjectName].res文件。当您启用“在项目中包含版本信息”选项时,IDE将在该.res文件里放置VERSIONINFO资源。 当您在IDE中编译项目时,如果需要,IDE将在链接到可执行文件之前用更新过的版本信息重新生成这个.res文件。 对于exe's,这个资源文件还包括MAINICON资源(在资源管理器中显示的图标)。

您不必使用这个特性,您可以让这个选项处于关闭状态,自己管理版本信息,方法是使用VERSIONINFO结构来创建自己的资源脚本(.rc), 然后编译它,并在您源代码中引用生成的.res文件。您甚至可以只引用.rc文件,

1
{$R 'myresource.res' 'myresource.rc'}

IDE将编译.rc文件并链接生成的.res文件中。需要注意的是,命令行编译器(dcc32、dcc64等)不支持这种技术。 

如果你的二进制文件没有版本信息,或者版本信息不正确,这通常是因为:

1) 该版本信息 资源没有在源中被引用,也没有被链接
2) 有重复的VERSIONINFO资源被链接,windows会选择它找到的第一个VERSIONINFO资源。
3) 您将版本信息设置到了错误的IDE配置中(下文有详细说明)。 

Delphi IDE,连同dproj文件(一个msbuild项目文件),使用一种复杂的配置继承机制来设置项目属性,包括版本信息。许多开发人员都因为这种模式产生纰漏,将版本信息设置在了层级的错误节点上,导致他们的可执行文件中没有版本信息。 多年来通过多个版本的delphi升级的dproj文件也存在问题。

使用FinalBuilder

在开发环境中,版本信息通常不太重要,但对于正式发布版来说,这是至关重要的,所以好的做法是,将版本信息的设置/更新留给自动构建工具或持续集成服务器。 在FinalBuilder中,我们投入了大量的时间和精力,能够针对所有不同的delphi版本正确地处理版本信息,并处理每个版本(有很多版本!)的反复变化和细微差别。

在FinalBuilder的Delphi动作(action)中,Version Info(版本信息)选项卡以类似于旧版本delphi IDE的方式显示版本信息(个人认为是一个比当前版本更好的用户界面)。 这个用户界面允许您控制所有不同的版本信息属性(有很多!)。注意,只有您在Project(项目)选项卡上勾选了Regenerate resource(重新生成资源)选项(即,重新生成yourproject.res文件),这些才会生效。 

注意,主要(Major)、次要(Minor)、发布(Release)和构建(Build)字段都是数字自旋编辑方式,不能使用FinalBuilder变量。在BeforeAction脚本事件(javascript)中,可以通过一些简单的脚本轻松地解决这个问题 :

另一个选择是使用“属性集”来提供版本信息(Version Info)的源。当您有多个动作(actions)需要相同的版本信息,或者至少共享相同的版本号时,“属性集”特别有用。创建“属性集”很简单,只需在Delphi动作前,在目标上执行一个“属性集定义”(PropertySet Define)动作。在“属性集定义”(PropertySet Define)动作中,选择Win32 Version Info来管理所有的版本信息属性,或者选择Win32 Version Numbers来使属性集可以管理主要版本号、次要版本号、发布版本号和构建号。

要设置属性集的值,在Delphi动作之前添加一个“属性集赋值”(PropertySet Assign Values)动作。

然后在Delphi动作中在version info选项卡中选择属性集,这将是一项简单的任务。

注意,版本号字段处于禁用状态,因为它们现在是由属性集提供的。如果选择Win32 Version Info属性集类型,更多字段将被禁用。

还有一件我应该提到的事情是,除了Version Info和MAINICON,project.res文件通常(至少对于windows而言)也包含manifest清单文件。我建议您查看Resource Compiler(资源编译器)选项卡,在该选项卡中您可以选择使用哪种资源编译器(在旧版本的delphi中更有用,旧版本中brcc32不能处理一些hicolor高彩图标类型)并指定manifest清单文件。几年前我在本博客的文章中讨论过windows manifest清单文件。