维护程序集版本号的最佳实践/指导

我正在寻找关于如何管理.NET程序集的三个不同程序集版本号的指针,建议,甚至是听写。 产品版本是最简单的,因为这似乎通常会由业务决定。 然后,文件版本似乎用于部署之间的版本控制,其中实际组装版本仅在运输时使用。

现在我只是寻找一个简单的方法来标记一个不依赖的程序集的测试和维护版本,所以我正在考虑在文件版本上自动递增构建版本和修订版本号,并且为了最终版本,复制当前版本文件版本到程序集版本。 该产品正在生产中使用,但仍在开发中 - 您知道 - 这些小公司之一,没有改变控制基础设施的情况。


版本控制是我非常热衷的事情,并花了很长时间试图提出一个易于使用的版本控制系统。 从您在问题中已经提到的内容可以清楚地看出,您已经理解了一个重要的观点,程序集版本号与产品版本不同义。 一个是技术驱动的,另一个是业务驱动的。

以下假定您使用某种形式的源代码管理和构建服务器。 对于上下文,我们使用TeamCity和Subversion / Git。 TeamCity对于少量(10)个项目是免费的,并且是一个非常好的构建服务器,但也有其他的,其中一些完全免费。

版本号码的含义

一个版本对一个人意味着什么可能意味着与另一个人不同的东西,总体结构是主要的,次要的,宏观的,微观的。 我看待版本号的方式是将其分解成两部分。 前半部分描述了主要版本(Major)和任何关键更新(Minor)。 下半部分显示了它的构建时间和源代码版本。 版本号还取决于上下文意味着不同的事情,它是API,Web应用程序等。

MajorMinorBuildRevision

  • Revision这是从源代码管理中获取的编号,用于确定实际构建的内容。
  • Build这是一个不断增加的数量,可用于在构建服务器上查找特定的构建。 这是一个重要的数字,因为构建服务器可能使用不同的参数集构建了两次相同的源。 将内部版本号与源代码结合使用,可以确定构建的内容和方式。
  • Minor这应该只在公共界面发生重大变化时才会更改。 例如,如果它是一个API,消费代码仍然能够编译? 主号码更改时,此号码应重置为零。
  • Major表示您所在产品的版本。 例如,所有VisualStudio 2008程序集中的Major都是9,而VisualStudio 2010是10。
  • 规则的例外

    规则总是有例外,你必须在碰到它们时适应。 我原来的做法是基于使用颠覆,但最近我已转移到Git。 使用中央存储库的源代码控制(如颠覆和源代码安全)有一个数字,可用于从给定时间标识特定的一组数据源。 分布式源代码控制(如Git)并非如此。 由于Git使用每台开发机器上的分布式存储库,因此没有可用的自动递增数字,因此存在一种使用检入数量的黑客攻击,但它很丑陋。 正因为如此,我不得不改进我的方法。

    MajorMinorMacroBuild

    版本号现在已经消失,版本已经转移到修订版本以及Macro已插入的位置。 你可以使用宏如何看待健康,但大部分时间我都会保持独立。 因为我们使用TeamCity,可以在构建中找到从修订号丢失的信息,这意味着有两个步骤的过程,但我们没有丢失任何东西,并且是可以接受的折衷方案。

    要设置什么

    首先要理解的是,组件版本,文件版本和产品版本不必匹配。 我不主张拥有不同的数字集合,但对组件进行小的更改并不会影响任何公用接口,因此您不必强制重新编译相关程序集,从而使生活变得轻松许多。 我处理这个问题的方法是仅在组件版本中设置主要和次要数字,但要在文件版本中设置所有值。 例如:

  • 1.2.0.0(AssemblyVersion)
  • 1.2.3.4(FileVersion)
  • 这使您能够推出不会破坏现有代码的修补程序,因为程序集版本不匹配,但可以通过查看其文件版本号来查看程序集的修订版/构建版。 这是一种常见的方法,当您查看程序集细节时,可以在某些开源程序集中看到。

    如果需要进行重大更改,作为团队负责人的您需要负责增加次要人数。 推出对接口进行必要更改但不破坏以前的代码的一种解决方案是将当前的代码标记为过时并创建新的接口。 这意味着现有代码会被警告,该方法已过时,可以随时删除,但不要求您立即破坏所有内容。 然后,当所有内容都被迁移后,您可以删除过时的方法。

    如何将它连接在一起

    您可以手动完成以上所有操作,但这会非常耗时,以下是我们如何自动执行此过程。 每一步都可以运行。

  • 从所有项目AssemblyInfo.cs文件中删除AssemblyVersionAssemblyFileVersion属性。
  • 创建一个通用程序集信息文件(称为VersionInfo.cs)并将其作为链接项添加到所有项目中。
  • AssemblyVersionAssemblyFileVersion属性添加到值为“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>
    

    希望我已经清楚,但涉及很多。 请提出任何问题。 我将使用任何反馈将更简洁的博客文章放在一起。

  • 编译程序集中的版本号
  • MSBuild扩展包
  • TeamCity的

  • [AssemblyVersion]在.NET中是一个非常重要的部分。 微软鼓励的一个理念是让它自动增量,强制依赖于程序集的所有项目都被重新编译。 如果您使用构建服务器,则可以使用。 做永远不是错误的事情,但要小心携带剑的人。

    另一个与其实际含义更密切相关的是,该数字代表了程序集公共接口的版本控制。 换句话说,当你改变公共接口或类时,你只能改变它。 由于只有这样的改变需要重新编译程序集的客户端。 虽然这需要手动完成,但构建系统不够智能以自动检测此类更改。

    您可以进一步扩展此方法,只需在将程序集部署到无法实现的机器上时增加版本。 这是微软使用的方法,他们的.NET程序集版本号很少改变。 主要是因为它们对顾客造成的非常大的痛苦。

    所以微软宣扬的不是它的做法。 它的构建过程和版本控制是无与伦比的,他们甚至有专门的软件工程师来监控过程。 如果工作得不太好,WaitHandle.WaitOne(int)过载尤其会造成相当大的痛苦。 在.NET 4.0中修复了一种非常不同的方法,但这已经超出了范围。

    这取决于你和你对你如何控制构建过程和发布周期以自行选择的信心。 除此之外,自动递增[AssemblyFileVersion]是非常合适的。 然而,这不受支持的不便。


    您可以使用版本号的Build部分进行自动增量。

    [assembly: AssemblyVersion("1.0.*")]

    在您的环境中,测试版本是具有构建版本的版本!= 0.在发行版中,增加次要部分并将构建部分设置为0,这是如何识别发布的程序集。

    如果您在GAC中安装程序集,则随着时间的推移,您的GAC会充斥大量不同版本,因此请记住这一点。 但是如果你只在本地使用dll,我认为这是一个很好的做法。

    链接地址: http://www.djcxy.com/p/50669.html

    上一篇: Best practices/guidance for maintaining assembly version numbers

    下一篇: How to have an auto incrementing version number (Visual Studio)?