在MSBuild中生成版本号

6
我们有一个使用WiX安装程序和MSBuild构建脚本的C#解决方案。我们正在从SVN迁移到Git。
作为版本号的第四部分,我们希望有一个随着每个构建递增的内容。到目前为止,我们使用了SVN修订号。MSBuild脚本定义了一个ProductVersion属性,其中将SVN修订号作为构建版本的四个数字中的最后一个。然而,我们不能再使用它了,因为我们将不再使用SVN。
我一直在寻找SVN修订号的替代方案,但我找不出该用什么。
Jenkins提供了一个可以使用的构建编号,但我不想把我们的版本控制系统与Jenkins绑定在一起。
Jenkins还提供了一个时间戳,但它不符合Microsoft的版本号限制:它是字母数字混合的且相当长,而版本中的第四个数字应该是介于0和65535之间的整数。
我们可以将AssemblyVersion设置为1.0.*,并让.NET填充其余部分。这适用于我们的程序集,但我找不到一种方法来将其注入到WiX中。我们可以在编译完一个程序集后从其中获取它,但我们的MSBuild脚本使用任务一次性构建整个解决方案,所以我们陷入了一个进退两难的境地,我们需要运行以便它可以编译一个程序集,以便我们可以从中获取生成的版本号,但是为了运行,我们首先需要有一个已编译的程序集,以便我们可以从中获取生成的版本号。
我可以在MSBuild文件中添加一个单独的Target来编译一些东西(任何东西),并从中获取版本号,然后执行实际的任务调用。但那感觉不对。
再次强调,我并不真正关心这个数字是什么,只要它随着每个构建递增即可。基于时间戳的内容也可以。您有什么想法?
3个回答

7
The MSbuild Community Tasks包含一个名为Version的任务,它提供了一些算法来生成版本号码。该任务易于使用且可定制。
在我看来,最好使用一个绑定整个SDLC的编号,这样您就可以将部署的产品跟踪到构建结果,然后再跟踪回版本控制系统等等。我建议使用Jenkins构建号,就像Christopher Painter所做的那样。

我看到 BuildType="Automatic" 和 RevisionType="Automatic" 所做的事情与 AssemblyVersion 中的 * 相同。太好了!这解决了我的问题。 - jqno

1

您可以通过使用!(bind.FileVersion.FileId)从程序集中获取版本号,其中FileId是在您的任一wxs文件中定义的File元素的ID。

然后,只需让.NET生成程序集号,WiX将使用它作为ProductVersion。


这就是我所说的进退两难:我该使用哪个汇编?我必须先构建它... - jqno
我的意思是我可以这样做,但我必须将构建分为两个独立的步骤,而现在只需一个干净简单的调用即可构建整个解决方案。 - jqno
这正是我所做的,我不必分两步运行MSBuild。由于Wix安装程序将引用.NET程序集/可执行文件,因此在使用读取版本之前,它将等待构建完成。通常我使用应用程序的主入口点作为绑定文件。 - caveman_dick
没错。肯定要等到程序集构建完成后才能构建安装程序吧?否则它怎么能将这些程序集打包到安装程序中呢? - ChrisPatrick
嗯,是的,现在我回过头来看这个,确实听起来有点傻,对此感到抱歉: )。但是,我们实际上在同一个解决方案中有多个项目,每个项目都有自己的WiX安装程序。由于我不想在迁移到git的过程中进行大规模的Wix重构,这意味着需要在6个单独的WiX脚本中完成此操作,而以前只需传递版本即可... - jqno

1
为什么不将其与Jenkins绑定?似乎您希望Jenkins管理传递到构建中的属性,包括版本号。这就是我使用BuildForge、TFS等工具的方式。

我想要通过命令行手动构建,而不会遇到版本问题。 - jqno
4
我通常会做类似这样的事情:<PropertyGroup><ProductVersion Condition="'$(ProductVersion)' == ''">0.0.0.1</ProductVersion>。这样,如果我手动运行MSBuild,则默认为0.0.0.1,但如果我的真正的构建自动化(如TFS、BuildForge、Jenkins等)运行它,我可以传递/p:ProductVersion=1.2.3.4并覆盖它。 - Christopher Painter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接