使TeamCity版本与.NET程序集版本匹配

15

现在我们的程序集版本号是像 2.0.831.0 这样的。据我所知,这是主版本号、次版本号、日期和构建号。如果我做了一些更改并在同一天进行构建,那么版本号会变成 2.0.831.1, 2.0.831.2 等。

我的 TeamCity 构建号格式只是简单的 2.{0},其中 {0} 是自动递增的数字,一直向上(2.195,2.196 等)。

如何使 TeamCity 的版本号与程序集版本完全相同?我们希望能够将变更日志与程序集版本相关联,以便任何人都可以说程序集版本 2.0.831.2 中的这些更改在这些文件中。

额外信息: 如果有影响,我们的构建步骤使用“Visual Studio (sln)”选项而不是 MSBuild。 如果有影响,我们使用 Subversion 进行源代码控制。 我们的 TeamCity 版本是 6.5.1(构建版本 17834)。


https://dev59.com/tEjSa4cB1Zd3GeqPCybc - sylvanaar
2个回答

21
我建议您采用语义化版本控制方案{major}.{minor}.{patch},并添加第四个元素来表示构建编号{major}.{minor}.{patch}.{build}。这样比将构建日期包含在版本控制方案中更有用。
TeamCity 6.5(您没有指定版本)具有一个构建特性,可用于在构建期间修补AssemblyInfo.cs中的版本。请参阅AssemblyInfo Patcher的文档。

AssemblyInfo patcher dialog (TeamCity documentation)

您可以定义构建号格式,以您希望在程序集中使用的方式,并将该格式用于构建本身以及修补功能。


因为我没有足够的声望来评论,所以将ccellar作为答案进行评论。版本字符串格式为: major.minor[.build[.revision]] 构建号是第三个元素,而不是第四个。如果AssemblyVersion不符合此格式,则Version类的Build和Revision属性将具有不正确的值。 http://msdn.microsoft.com/en-us/library/system.version.aspx - jbtibor
2
@jbtibor 说得好,微软有不同的版本号方案,但我认为 ccellar 的方案更合理,也是我使用的方案。想一想:使用 TeamCity 构建号时,构建号始终是唯一的,因此多个构建可以具有相同的修订版,但在同一构建中不可能有多个修订版,这似乎是微软方案所暗示的。 - Matt Miller
你可以在 AssemblyInfo.cs 文件中使用 AssemblyInformationalVersionAttribute 属性来指定 semver 版本(该属性允许你指定任何字符串作为版本)。这个值可以被构建过程捕获并使用。我喜欢这个想法,开发者可以在提交更改之前决定要检入的事物的版本信息。 - Emil G

6
一种解决方案是使用MSBuild运行程序,并编写一个MSBuild脚本,从AssemblyInfo文件中读取版本信息,将TeamCity构建版本设置为该值,同时在运行构建时增加版本号部分,并将该值写回到AssemblyInfo中。这并不是非常简单,因为您需要了解如何编写自定义的MSBuild脚本,并且可能需要使用一些社区任务等来读取/写入版本信息。
我们还使用全局AssemblyInfo文件的概念,所有程序集都引用它(使用VS中的Add Link),因此我们只需要在构建期间更新一个文件。
有一篇优秀的文章here,描述了使用MSBuild执行常见CI任务。他正在使用CruiseControl.NET,但其中许多仍然适用。如果您正在运行TeamCity 6.5,则应专门研究其构建功能,因为这比自定义的MSBuild脚本更容易维护。

1
这一切都很有道理。有没有关于实现这个的教程?我以前从未使用过MSBuild。您有任何具体的示例吗? - Dzejms

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