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

2024-04-01

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

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


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

以下假设您使用某种形式的源代码管理和构建服务器。对于上下文,我们使用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/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

维护程序集版本号的最佳实践/指南 的相关文章

  • 应用服务中的内存利用率是否可​​以提高

    我有一个相当简单的 Web 应用程序在 Azure 的 B1 服务计划中的应用服务计划中运行 该计划提供 1 个 CPU 和 1 75GB RAM CPU 使用率永远不会超过 5 左右 内存使用率永远不会低于 52 我确实停止了计划中唯一运
  • 在 C# 中执行基于存储过程的查询后,如何重新使用 CommandText 的 SqlCommand 对象?

    我有一个示例代码 aCommand CommandType CommandType StoredProcedure aCommand Parameters AddWithValue book id bookID aCommand Param
  • 使 .net web api 队列请求以“单线程”方式运行

    我们有一个 c net Web API 服务调用代码 该代码无法一次处理多个数据库请求 该系统适用于需求相对较小的账单在线支付 我们无法控制代码来进行可以解决问题的更改 另一个使用相同代码的小组使用 WCF API 和服务配置将并发请求限制
  • Quartz 与“反应式扩展”

    我正在寻找 C 的调度库 很长一段时间以来 我认为 唯一 的选择是 Quartz NET 它非常强大并且工作得很好 但是当我发现 Reactive Extensions RX http msdn microsoft com en us da
  • 如何检查 NTAccount 对象代表组还是用户?

    使用返回的访问规则时 GetAccessRules True True GetType System Security Principal NTAccount 如何判断每个规则中引用的 NTAccount 对象是用户帐户还是组 Update
  • F# 命名约定

    F 是否有 官方 命名 大小写约定 我总是怀疑是否使用 C 风格 Class MyFunctionName or Module my function name 在 F 中 您应该混合 BCL 类和 F 库类 它们具有不同的大小写 并且代码
  • 什么可以解释托管堆上超过 5,000,000 个 System.WeakReference 实例?

    我一直在针对生产 ASP NET Web 应用程序运行负载测试 并且看到在堆上创建了大量 System WeakReference 在大约 15 分钟内 负载管理堆内存已飙升至大约 3GB 并且我有大约 5 000 000 个对 Syste
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • 序列化和反序列化 HttpRequestMessage 对象

    有人有序列化 HttpRequestMessage 对象的经验吗 尝试使用 Json net 它部分有效 也就是说 JsonConvert DeserializeObject 由于 StringContent 构造问题而失败 无法找到用于类
  • Git 到 TFS 源代码管理迁移

    我想看看 TFS 如何为我的命令工作 所以我想将我们当前的 GIT 存储库移动到 TFS 数据库 我们使用 GIT 来获得普遍的分支支持 因此我想使用 TFS 2010 来解决该问题 现在的问题是 如何将 GIT 存储库导出到 TFS 显然
  • .net 中的 deflate、gzip 和 zlib 的一个库

    首先 我们来定义一些容易混淆的术语 deflate compression algorithm zlib header deflate trailer gzip header deflate trailer 我正在寻找一个基本上可以让我执行
  • Windows DPAPI - 如何处理熵?

    我正在使用 Windows DPAPI 来加密一些敏感数据 密码存储在注册表中 这一切都运行良好 但我想知道是否有人可以澄清我对 NET 中 可选 提供给 ProtectedData Protect 的 熵 字节的理解 熵 字节数组似乎类似
  • 从架构上来说,我应该如何用更易于管理的内容替换非常大的 switch 语句?

    EDIT 1 忘记添加嵌套属性曲线球 UPDATE 我选择了 mtazva 的答案 因为这是我的具体案例的首选解决方案 回想起来 我用一个非常具体的例子提出了一个一般性问题 我相信这最终让每个人 或者也许只是我 对问题到底是什么感到困惑 我
  • AutoMapper 2.0 中的 ITypeConverter 接口已更改

    ITypeConverter 接口已更改为 Convert 方法具有 TDestination Convert ResolutionContext context 而不是 TDestination Convert TSource sourc
  • 如何使用 NGEN 二进制文件安装 IronPython 2.0?

    有谁知道如何使用 MSI 包安装带有 NGEN 二进制文件的 IronPython 2 0 这IronPython 官方主页 http www codeplex com IronPython据说NGEN选项将大大改善启动时间 但由于某种原因
  • 从同一个类中的另一个构造函数调用构造函数

    我有一个带有两个构造函数的类 C 这是代码片段 public class FooBar public FooBar string s constructor 1 some functionality public FooBar int i
  • 等待 IAsyncResult 函数直至完成

    我需要创建等待 IAsyncResult 方法完成的机制 我怎样才能做到这一点 IAsyncResult result contactGroupServices BeginDeleteContact contactToRemove Uri
  • WebBrowser.Print() 等待完成。 。网

    我在 VB NET 中使用 WebBrowser 控件并调用 Print 方法 我正在使用 PDF 打印机进行打印 当调用 Print 时 它不会立即启动 它会等到完成整个子或块的运行代码 我需要确保我正在打印的文件也完整并继续处理该文件

随机推荐

  • 获取正确的月份格式日期java

    有什么帮助吗 如何从 2014 01 10T09 41 16 000 0000 这样的字符串中获取正确的日期 我的代码是 String strDate 2014 01 10T09 41 16 000 0000 String day Stri
  • 有人可以澄清一下 Joel On Software 引用的意思吗:(功能性程序没有副作用)

    我正在读书乔尔安软件 http www joelonsoftware com 今天又遇到了这个报价 http www joelonsoftware com articles ThePerilsofJavaSchools html 不了解功能
  • BigQuery JDBC 驱动程序返回的行数不会超过 100,000 行

    我在 Pentaho PDI 中使用 Google BigQuery 的 starschema JDBC 驱动程序 http code google com p starschema bigquery jdbc http code goog
  • AWS Lambda:Lambda 函数 S3 到 S3 复制的跨账户策略

    我们正在尝试实现 lambda 函数 该函数将根据源 S3 存储桶事件将对象从一个 S3 复制到跨账户中的另一个 S3 存储桶 目前 我们能够在同一 SAG 内的源和目标之间复制文件 但是当我们尝试跨账户实现相同的逻辑时 得到了 CopyO
  • windows下Qt应用程序和窗口图标

    我通过嵌入包含图标的标准 Windows 资源文件创建了一个简单的应用程序图标 不过 我还想在我的主应用程序窗口上使用此图标 是否有捷径可寻 到目前为止 似乎唯一的方法是单独加载包含窗口图标的图标 而不是重用已经存在的图标 这似乎是一个可怕
  • 更改 foreach 循环内的初始数组?

    我想要一个 foreach 循环 其中初始数组在循环内更改 eg array array red blue foreach array as key gt value array white echo value br 在此循环中 尽管我在
  • iOS Google 静默登录提供了缺少个人资料信息的(有效)令牌

    我已将 Google SignIn SDK v4 0 1 集成到我的 iOS 应用程序中 正常的身份验证过程通过以下方式正常工作 GIDSignIn sharedInstance signIn 检索到的 idToken 有效 包含电子邮件和
  • 如何使用 .Net 处理程序处理 .asp 扩展名?

    我有一个旧的经典 ASP 网站 我正在将其迁移到 IIS7 5 我不想在服务器上安装经典 ASP 因此我只想将 asp 文件视为 aspx 文件 我该如何在 IIS7 5 中执行此操作 编辑 澄清一下 我并不是在问如何让经典的 ASP 代码
  • Highstock日期输入jquery ui datepicker位置变化

    在 Highstock 中 您可以使用 jquery ui datepicker 而不是在日期字段中输入文本 如本演示所示 http jsfiddle net hcharge aNde9 http jsfiddle net hcharge
  • 在 Chrome 中播放多种声音

    我正在为 Facebook 开发 HTML5 游戏 我有以下 HTML 代码
  • 如何让小圆圈的边框变得平滑?

    有没有办法让纯 CSS 圆形边框在较小尺寸下看起来清晰明快 或者有什么方法可以使边框在外边缘周围不出现 锯齿状 非常感谢 Use box shadow针对此问题的 CSS 属性 请看下一个例子 http jsfiddle net RJMWR
  • GCC最高指令集,兼容多种架构

    我正在由具有不同架构的机器组成的集群上运行作业 gcc march native Q help target grep march cut f3给了我其中之一 broadwell haswell ivybridge sandybridge
  • 你能建议一个好的 minhash 实现吗?

    我正在尝试寻找一个可以在我的工作中利用的 minhash 开源实现 我需要的功能非常简单 给定一个集合作为输入 实现应该返回其 minhash 首选 python 或 C 实现 以防万一我需要破解它才能为我工作 任何指示都会有很大帮助 Re
  • 如何在 C# 注册表类中使用 REG_OPTION_OPEN_LINK

    我想打开一个符号链接的注册表项 据微软称 https learn microsoft com en us windows win32 api winreg nf winreg regopenkeyexw parameters我需要使用REG
  • 使用 NSDocument 时如何将故事板视图绑定到核心数据实体?

    我正在构建一个使用核心数据 NSDocument 故事板和 Cocoa 绑定的 OS X 应用程序 我的期望是发生以下情况 一个实例MyDocument NSDocument子类 被创建 MyDocument创建核心数据NSManagedO
  • Google Play -505 安装错误

    我在 Google Play 中有一个应用程序 它是使用工具和 API 22 构建的 一切运行良好 但上次使用 API 23 工具 23 1 的更新向用户显示编号为 505 的 Android 6 0 错误 在 Google Play 应用
  • Python/Django - 避免在源代码中保存密码

    我使用 Python 和 Django 创建 Web 应用程序 并将其存储在源代码管理中 按照 Django 通常的设置方式 密码在 settings py 文件中以纯文本形式显示 以纯文本形式存储我的密码会给我带来许多安全问题 特别是因为
  • 有没有办法从 json-server 文件生成 swagger.json

    对于原型设计 我们使用 json server 库 它根据我们的 db json 文件创建假 REST api 现在我们想使用 swagger 所以我的问题是 有没有办法从我们的 db json 文件生成 swagger json 如果没有
  • 如何在 Android 中拍照、保存并获取照片

    我一直在搜索拍摄照片的简单示例 并使用 URI 保存它并检索照片进行图像处理 我尝试了很多示例代码 但没有一个顺利 有人有示例代码吗 像这样定义一个变量 protected static final int CAPTURE IMAGE AC
  • 维护程序集版本号的最佳实践/指南

    我正在寻找有关如何管理 NET 程序集的三个不同程序集版本号的指示 建议甚至指示 产品版本是最简单的 因为这通常是由业务决定的 然后 文件版本似乎用于部署之间的版本控制 其中实际的程序集版本仅在发货时使用 现在 我只是在寻找一种简单的方法来