65.9K
CodeProject 正在变化。 阅读更多。
Home

增量文件和产品版本号 - 多 IDE

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.58/5 (31投票s)

2008 年 3 月 11 日

CPOL

12分钟阅读

viewsIcon

316549

downloadIcon

1237

一个插件,可以自动增加应用程序资源文件中的 FileVersion 和 ProductVersion 字段。适用于 VC6 和 VS2005,以及可能介于它们之间的所有版本。

引言

此插件取代了我几年前提供的用于 Visual Studio 6 的插件。上一个插件基于 Mihai Filimon 的文章“Increment Private Build Number”。这个新插件使用上一个插件的核心代码来增加 rc 和/或 rc2 资源文件中的文件和产品版本。我已对一些地方进行了改进。

  • 多 IDE 兼容。我已验证它在 VC6、VC7.1 (VS2003)、VC8 (VS2005) 和 VC9 (VS2008) 中可用。我想它也应该适用于 VC7.0 (VS2002)。安装程序会注册此插件,以便 VC6、VC7.0、VC7.1、VC8 和 VC9 可以使用它。它在 VC9 中也能用,尽管一些用户报告了问题。
    1. 如果 VERSIONINFO 块位于 .rc 文件中,则 VC9 会报告资源已在外部更改,是否要重新加载。选择“是”会导致 VC9 崩溃。我已经验证了这一点,并很快将我的 VERSIONINFO 块移动到了 .rc2 文件中。我认为这是 VC9 的问题,而不是我的插件的问题 :)。
    2. 手动增量有效,但自动增量无效 — 我测试了 VERSIONINFO 块位于 .rc2 文件中的项目,对我来说它是有效的。(现在应该可以工作了,因为我已经修复了 EnvDTE._dispBuildEvents interfaceCBuildEventsSink 类实现。)

    我很想听听 VC7.0 用户的使用反馈,因为我尚未在该 IDE 中进行测试。

  • 文件和产品版本由四组数字组成 — 主版本、次版本、修订号和构建号。(有些人可能命名不同 — 但概念在这里很重要,而不是命名约定。毕竟,名称又有什么意义呢?)无论如何,上一个版本的插件仅限于增加此组中的最后一个数字。这个新插件允许您选择要增加的数字。
  • 添加了启用/禁用插件的选项。
  • 添加了仅增加启动项目版本的选项。这不适用于 VC6,因为插件只会增加当前活动项目。
  • 添加了即使存在编译错误也增加版本号的选项。默认情况下不增加。
  • 如果您选择增加主版本、次版本或修订号,系统会提供一个选项来“重置”较低的数字到它们的起始值。例如,如果您选择增加次版本,您可以选择重置较低的数字,使修订号重置为 0,构建号重置为 1。
  • 如果您选择增加主版本、次版本或修订号,您也可以选择在增加一次后,恢复为自动增加构建号。
  • 我还添加了版本块的 PrivateBuildSpecialBuild 条目,它们将像 ProductVersionFileVersion 条目一样被增加。
  • 我添加了选项来增加这四个字段中的所有或全部,或它们之间的任何组合。

背景

从 VC6 迁移到 VC8(现在是 VC9),我失望地发现我原来的 IncVersion 插件,它陪伴了我近 4 年,与 VC8 不兼容。我尝试寻找替代品,但没有一个真正合适,而且有一些小麻烦等。所以,我决定自己编写。

我非常幸运地偶然发现了 sp1ff 的一篇非常出色的文章,“Common Add-Ins”。太棒了!现在,我可以更新*我的*插件,它将同时适用于我的两个 IDE。经过一番折腾,我为您带来了我新开发的、多 IDE、略有改进的插件。我说多 IDE。我显然在我的两个 Visual Studio 版本 VC6 和 VC8 上进行了测试。但由于 sp1ff 文章的精彩之处,我毫不怀疑它也会适用于它们之间的所有版本。除非我搞砸了。(请注意,大部分代码是 sp1ff 的,他所有源代码文件都包含所需的注释块以反映这一点。)

使用插件

安装

我提供了一个 setup.exe,运行后会将插件 DLL 及其附属 UI DLL 安装到您选择的目录中。安装的第二部分是对注册表进行必要的修改,以“注册”插件以便 VC6、VC7.0、VC7.1、VC8 和 VC9 使用。

卸载将移除 DLL 并清理注册表。

增量

该插件包含一个工具栏,有两个按钮。一个用于执行手动版本增量,另一个用于配置版本组中要增加的数字。

Toolbar in VC6

VC6 中的 IncVersion

Toolbar in VC8

VC8 中的 IncVersion

更常用的是,每次构建项目/解决方案时,所选版本号也会自动增加。对于 VC6,这仅限于活动项目。对于 VC8,它包括活动项目及其所有依赖项。

注意:使用工具栏上的“增加”按钮执行手动增量时,只会增加活动项目的版本号。对于 VC6 和 VC8 都是如此。

注意:对于两个版本,无论源文件是否已更改,版本号都会增加。根据所选项,如果项目编译中有任何错误,被增加的数字将被恢复到其原始值。

如果发生编译错误,为什么还要先增加呢?增量函数在构建开始时调用,而不是在构建完成后调用,这样新的版本号就会被编译到生成的对象中。根据所选项,可能发生的任何错误都将导致数字再次减小。

此更新的插件会解析要增加的项目(们)的项目文件(.dsp/.vcproj),以查找其指定的所有 .rc.rc2 文件。因此,它不限于 .rc.rc2 文件必须位于项目目录或其 /res 子目录中。它将忽略任何非 C++ 项目,这些项目没有 .dsp/.vcproj 项目文件名扩展名。

警告

  • 如果项目中未找到资源文件,将显示警告消息。如果需要,可以关闭此警告。
  • 如果使用工具栏上的“增加”按钮执行手动增量,将显示一个消息框。
  • 如果增量作为项目编译的一部分发生,警告将写入 Visual Studio 的输出窗口。
  • 对于 VC6,这在输出窗口的“宏”选项卡上。对于 VC8,这在输出窗口的“IncVersion”窗格中。
  • 如果找到一个或多个 .rc/.rc2 文件但它们都不包含 VERSIONINFO 块,也将显示类似的警告。

VC6 - no resource files found warning message

VC6 - 未找到资源文件警告消息

VC6 - no VERSIONINFO block found warning on the Macro tab of the Output window

VC6 - 输出窗口“宏”选项卡上未找到 VERSIONINFO 块警告

VC8 - no VERSIONINFO block found warning message

VC8 - 未找到 VERSIONINFO 块警告消息

VC8 - no VERSIONINFO block found warnings and no resource files found warning in the IncVersion pane of the Output window

VC8 - “IncVersion”窗格中未找到 VERSIONINFO 块警告和未找到资源文件警告

如果文件或产品版本中,在将要增加的数字位置包含星号(*),则在 IncVersion 完成后,该数字将被重置为 1。

IncVersion 能够同时增加 .rc.rc2 文件中的多个版本块(即使它们被注释掉了!)。而且,一个版本块中可以有多个语言条目。所有条目都会被增加。

版本组中的数字由逗号或句点(美国英语称为 period)分隔。IncVersion 能够处理单个文件或产品版本条目中的一个或两个,并且还能处理同一组中这些分隔符的混合使用。

因此

VALUE "FileVersion", "4, 3, 1, 409\0"

VALUE "ProductVersion", "4. 3. 1. 409\0"

是没问题的。

VALUE "FileVersion", "4. 3, 1, 409\0"
VALUE "ProductVersion", "4. 3, 1. 409\0"

这样也没问题!

最后,数字组之间的空格无关紧要,它们会被忽略。所以 FILEVERSION 4,3,1,409FILEVERSION 4, 3,1 ,409 是相同的。

配置

通过取消选中“启用”复选框,可以禁用插件的增量功能。

默认情况下,如果没有编译错误,则执行增量。可以通过取消选中“编译错误时不增量”复选框,将选项设置为无论编译结果如何都进行增量。

对于 VC7 及更高版本,您可以选择增加活动配置中所有项目的版本。或者,要只增加启动项目的版本,请选中“仅活动/启动项目”复选框。

对于所有 IDE,您可以选择要增加的版本字段 — FileVersion、ProductVersion、PrivateBuild 和/或 SpecialBuild。

您可以通过单击“配置”按钮来更改要增加的数字。VC6 中会出现一个新的对话框,VC8 中会出现“选项”对话框。

VC6Options1.png

VC6 中的选项

VC8Options1.png

VC8 中的选项

这里,插件已启用,活动配置中的所有项目都将增加,只有没有编译错误的项目的版本才会被增加,所有四个版本字段都已选择增加,并且构建号被选择增加。

如果选择了不同的数字,您将看到另外两个选项。

VC6Options2.png

VC6 中的更多选项

VC8Options2.png

VC8 中的更多选项

这里,VC6 插件配置为一次增加主版本,然后恢复增加构建号。VC8 插件配置为增加次版本,重置修订号(回到 0)和构建号(重新开始为 1)。在增加次版本后,它也将恢复增加构建号。它还配置为仅增加 FileVersion 和 ProductVersion 字段,并且仅针对活动/启动项目。

两个 IDE 都已配置为即使项目中存在编译错误也增加版本号。

如果“恢复”复选框未勾选,插件将继续增加上次选择的数字。在我们的示例中,VC6 插件将继续增加主版本,VC8 插件将继续增加次版本。

最后的“显示警告”复选框决定是否显示消息(通过消息框或输出窗口)。如果您不想看到这些警告,请取消选中它。

安装程序

此插件使用 Jordan Russell 出色的 Inno Setup 进行部署。VC8 缺乏专用的插件部署向导,而且我懒得弄清楚哪个文件放在哪里等等。所以,我采用了我非常熟悉的方法,使用 Inno Setup 部署了两个 DLL。然后,安装脚本的后半部分运行各种 rgs 文件,为不同的 IDE 注册插件。卸载将删除 DLL 并清理注册表。;)

请求

由于我没有在 VC7.0 上测试过,我非常想知道它是否真的能在此 IDE 中工作。

当然,如果您遇到任何问题,请发布消息。

历史

  • 2008 年 3 月 11 日。提交新文章,包含适用于 VC6 和 VC8 的 IncVersion(已在两者上测试)。
  • 2008 年 3 月 18 日。更新文章以反映新的请求/功能。
  • 2008 年 3 月 19 日。更新为仅增加 C++ 项目。提供关闭警告消息的选项。
  • 2008 年 3 月 28 日。修复了 VC7 及更高版本,以处理 vcproj 文件中 rc/rc2 文件名末尾的“>”字符。
  • 2008 年 4 月 25 日。添加了 PrivateBuild 和 SpecialBuild 的增量。添加了完全禁用增量的选项,仅增加活动/启动项目的版本(不适用于 VC6),以及选择增加 FileVersion、ProductVersion、PrivateBuild 和/或 SpecialBuild 的能力。
  • 2008 年 5 月 2 日。VC8/9 选项 - 自动选择 IDE 的“工具”->“选项”对话框中的“增量版本插件”选项条目。VC8 和 VC9 源代码解决方案。抱歉,没有 VC7/7.1。而且,显然没有 VC6(因为其中包含 VC7+ 代码,无法在 VC6 上编译)。
  • 2008 年 5 月 24 日。修复了一些用户手动增量有效但自动增量无效的问题。我想感谢 Josemi Antelo 帮助我追踪了这个问题。添加了即使项目编译有错误也允许增量的选项。
  • 2008 年 6 月 10 日。修复了允许项目名称中包含空格的问题。感谢 Kevanmc 指出这一点并提供了修复。
  • 2008 年 6 月 23 日。修复了卸载程序,使其可以从各种 IDE 中移除工具栏。
  • 2008 年 7 月 21 日。修复了 VC6 安装,将 DLL 放入 \Program Files\Microsoft Visual Studio\Common\MSDev98\AddIns 目录。这应该可以解决按下两个按钮无效的问题。
  • 2008 年 7 月 25 日。修复了 VC6(以及可能所有 IDE),允许项目路径名包含多字节字符。我衷心感谢 Haerim Lee 首先发现了问题并帮助我测试了修复。
  • 2008 年 9 月 13 日。仅在 Build/RebuildAll 事件时才增量,不包括 Clean。感谢 I'm Pear 发现了此 bug。
  • 2008 年 10 月 20 日。修复了当您以某种方式编辑资源、编译但出现错误时,资源编辑丢失的情况。我更改了内部逻辑,以便版本增量在项目构建完成后进行。再次感谢 Haerim Lee 发现了此 bug。

待解决的问题

同时支持多个 IDE,以及使用插件的人越多,就越会暴露各种小(甚至一些大的!)bug。

以下是我已知的一些待解决的 bug,以及我正在考虑/处理的增强请求。

  • 程序集文件增量 — 支持托管 C++、C#、VB 和 J#。
  • 仅当项目中的源代码已更改时才增加版本号。
  • 静默 .rc 重新加载消息。(这个需求很普遍,我能理解。)
  • 仅当项目中的源代码已更改时才增加版本号。
  • 在执行命令行构建或单击增量按钮时,增加解决方案/工作区中所有源代码已更改的项目,而不仅仅是当前活动项目 — 受“仅活动/启动项目”设置的约束。
  • 构建配置选择,以决定是仅增加调试版还是发布版,或任何组合。
  • SourceSafe 集成 — 无需多言!
© . All rights reserved.