版本控制是我非常热衷的事情,并且花了很长时间试图提出一个易于使用的版本控制系统。从您在问题中已经说过的内容来看,很明显您已经理解了重要的一点,程序集版本号并不与产品版本同义。一是技术驱动,二是业务驱动。
以下假设您使用某种形式的源代码管理和构建服务器。对于上下文,我们使用TeamCity http://www.jetbrains.com/teamcity/和 Subversion/Git。 TeamCity 对于一小部分(10)个项目是免费的,是一个非常好的构建服务器,但还有其他一些,其中一些是完全免费的。
版本号的含义是什么
一个版本对一个人的意义可能对另一个人意味着不同的东西,一般结构是大、小、宏观、微观。我查看版本号的方式是将其分为两部分。前半部分描述了主要版本(Major)和所有关键更新(Minor)。后半部分表明它的构建时间以及源代码版本是什么。根据上下文的不同,版本号也有不同的含义,是 API、Web 应用程序等。
Major
.Minor
.Build
.Revision
-
Revision
这是从源代码控制中获取的数字,用于识别内容
实际上已经建成了。
-
Build
这是一个不断增加的数字,可用于查找
构建服务器上的特定构建。
这是一个重要的数字,因为
构建服务器可能已经构建了相同的
使用不同的一组源两次
参数。使用内部版本号
与源编号结合
允许您识别构建了什么
如何。
-
Minor
仅当发生重大变化时才应更改
公共接口。例如,如果它是一个
API,消耗代码仍然是
能编译吗?当主编号更改时,该编号应重置为零。
-
Major
表示什么版本
您正在使用的产品。例如
主要是Visual Studio 2008
程序集是 9 和 Visual Studio 2010
是 10。
规则的例外
规则总有例外,遇到例外时您必须适应。我最初的方法是基于使用 subversion,但最近我已经转向 Git。使用中央存储库的源代码控制(例如 subversion 和源安全)具有可用于识别给定时间的一组特定源的编号。对于像 Git 这样的分布式源代码管理系统来说,情况并非如此。因为 Git 使用位于每台开发机器上的分布式存储库,所以没有可以使用的自动递增数字,因此有一个使用签入数量的 hack,但它很丑陋。因此,我必须改进我的方法。
Major
.Minor
.Macro
.Build
修订版号现已消失,构建已转移到修订版原来所在的位置,并且已插入宏。您可以按照您认为合适的方式使用宏,但大多数时候我不会管它。因为我们使用 TeamCity,所以可以在构建中找到修订号丢失的信息,这确实意味着有一个两步过程,但我们没有丢失任何内容,这是一个可以接受的折衷方案。
设置什么
首先要了解的是,程序集版本、文件版本和产品版本不必匹配。我并不是提倡使用不同的数字集,但是当对程序集进行小的更改时,这会让生活变得更加容易,而这些更改不会影响任何公共接口,并且您不会被迫重新编译依赖程序集。我处理这个问题的方法是仅在程序集版本中设置主要和次要数字,但在文件版本中设置所有值。例如:
- 1.2.0.0(程序集版本)
- 1.2.3.4(文件版本)
这使您能够推出修补程序,这不会破坏现有代码,因为程序集版本不匹配,但允许您通过查看程序集的文件版本号来查看程序集的修订/构建。这是一种常见的方法,当您查看程序集详细信息时,可以在某些开源程序集中看到这种方法。
作为团队领导,您需要负责在需要进行重大更改时增加次要编号。对接口进行所需更改但不破坏以前的代码的一种解决方案是将当前代码标记为已过时并创建一个新接口。这意味着现有代码会被警告该方法已过时,可以随时删除,但不需要您立即破坏所有内容。当所有内容都已迁移后,您可以删除过时的方法。
如何将其连接在一起
您可以手动完成上述所有操作,但这会非常耗时,以下是我们如何自动化该过程。每个步骤都是可运行的。
- 去除AssemblyVersion http://msdn.microsoft.com/en-us/library/system.reflection.assemblyversionattribute%28v=vs.100%29.aspx and AssemblyFileVersion http://msdn.microsoft.com/en-us/library/system.reflection.assemblyfileversionattribute.aspx所有项目 AssemblyInfo.cs 文件中的属性。
- 创建一个通用程序集信息文件(称为 VersionInfo.cs)并将其作为链接项添加到所有项目中。
- Add
AssemblyVersion
and AssemblyFileVersion
属性值为“0.0.0.0”的版本。
- 创建一个用于构建解决方案文件的 MsBuild 项目。
- 在更新 VersionInfo.cs 的构建之前添加一个任务。有许多开源 MsBuild 库包含可以设置版本号的 AssemblyInfo 任务。只需将其设置为任意数字并进行测试即可。
- 添加一个属性组,其中包含内部版本号的每个段的属性。这是您设置主要和次要的地方。内部版本号和修订号应作为参数传递。
随着颠覆:
<PropertyGroup>
<Version-Major>0</Version-Major>
<Version-Minor>0</Version-Minor>
<Version-Build Condition=" '$(build_number)' == '' ">0</Version-Build>
<Version-Build Condition=" '$(build_number)' != '' ">$(build_number)</Version-Build>
<Version-Revision Condition=" '$(revision_number)' == '' ">0</Version-Revision>
<Version-Revision Condition=" '$(revision_number)' != '' ">$(revision_number)</Version-Revision>
</PropertyGroup>
希望我已经说得很清楚了,但其中涉及很多内容。有任何问题请提问。我将利用任何反馈来撰写更简洁的博客文章。
- 已编译程序集中的版本号 http://blogs.msdn.com/b/carloc/archive/2008/02/22/the-meaning-of-version-numbers-in-a-compiled-assembly.aspx
- MSBuild 扩展包 https://github.com/mikefourie/MSBuildExtensionPack
- TeamCity http://www.jetbrains.com/teamcity/