.net - 维护程序集版本号的最佳实践/指南

标签 .net version-control versioning .net-assembly assemblyversions

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

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

最佳答案

版本控制是我非常热衷的事情,并且花了很长时间试图想出一个易于使用的版本控制系统。从您在问题中已经说过的内容来看,很明显您已经理解了一个重要的观点,即程序集版本号并不是产品版本的同义词。一个是技术驱动,另一个是业务驱动。

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

版本号是什么意思

一个版本对一个人意味着什么,对另一个人意味着什么,一般结构是主要的、次要的、宏观的、微观的。我查看版本号的方式是将其分解为两部分。前半部分描述了主要版本(Major)和任何关键更新(Minor)。后半部分表示它的构建时间和源代码版本。版本号也意味着不同的东西,具体取决于上下文,它是 API、Web 应用程序等。
Major . Minor . Build . Revision

  • Revision这是从源代码控制中获取的数字,用于识别什么
    实际上是 build 的。
  • Build这是一个不断增加的数字,可用于找到
    构建服务器上的特定构建。
    这是一个重要的数字,因为
    构建服务器可能已经构建了相同的
    使用不同的一组源两次
    参数。使用内部版本号
    与来源编号结合
    允许您识别构建的内容
    以及如何。
  • Minor这应该只在发生重大变化时才会改变
    公共(public)接口(interface)。例如,如果它是一个
    API,仍然会消耗代码
    能编译吗?当主编号更改时,此编号应重置为零。
  • Major表示什么版本的
    您正在使用的产品。例如
    所有 VisualStudio 2008 的专业
    程序集是 9 和 VisualStudio 2010
    是 10。

  • 规则的异常(exception)

    规则总是有异常(exception)的,您必须在遇到它们时进行调整。我最初的方法是基于使用 subversion,但最近我转向了 Git。使用中央存储库的像 subversion 和 source safe 这样的源代码控制有一个数字,可用于从给定时间识别一组特定的源。对于诸如 Git 之类的分布式源代码控制,情况并非如此。因为 Git 使用位于每台开发机器上的分布式存储库,所以没有您可以使用的自动递增编号,所以有一个使用 checkin 数量的 hack,但它很丑陋。因此,我不得不改进我的方法。
    Major . Minor . Macro . Build
    修订号现已消失,构建已转移到以前修订的位置,并且已插入宏。您可以使用您认为合适的宏,但大多数时候我不理会它。因为我们使用 TeamCity,可以在构建中找到从修订号丢失的信息,这确实意味着有一个两步过程,但我们没有丢失任何东西,这是一个可以接受的妥协。

    设置什么

    首先要了解的是,程序集版本、文件版本和产品版本不必匹配。我不提倡使用不同的数字集,但是当对不影响任何公共(public)接口(interface)的程序集进行小的更改时,它会让生活变得更轻松,您不必重新编译依赖程序集。我处理这个问题的方法是只在程序集版本中设置主要和次要编号,而在文件版本中设置所有值。例如:
  • 1.2.0.0(汇编版本)
  • 1.2.3.4(文件版本)

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

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

    如何将它连接在一起

    您可以手动完成上述所有操作,但这会非常耗时,以下是我们如何自动化该过程。每一步都是可运行的。
  • 删除 AssemblyVersion AssemblyFileVersion 来自所有项目 AssemblyInfo.cs 文件的属性。
  • 创建一个通用程序集信息文件(称为 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>
    

    希望我已经清楚了,但涉及很多。请提出任何问题。我将使用任何反馈将更简洁的博客文章放在一起。
  • Version numbers in a compiled assembly
  • MSBuild Extension Pack
  • TeamCity
  • 关于.net - 维护程序集版本号的最佳实践/指南,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3768261/

    相关文章:

    c# - 如何使用 LinqToExcel 获取没有标题的单元格值

    version-control - 如何在 Qt Creator 的项目设置中对多用户使用版本控制?

    version-control - DBML更改和源代码控制

    java - Git分支管理: Local vs.远程

    git - 具有多种服务和独特版本控制的 Mono Repository

    ios - 我们可以在发布时在 iTunes Connect 中保持相同的版本号吗?

    C#,查找控件

    .net - Ajax NumericUpDown 扩展器按钮布局

    c# - 如何避免使用 async void 事件处理程序重入?

    msbuild任务读取dll的AssemblyFileVersion