如何对 .NET 进行版本控制

.NET 运行时和 .NET SDK 以不同的频率添加新功能。 通常,SDK 的更新频率高于运行时。 本文介绍运行时和 SDK 版本号。

.NET 每 11 月发布一个新的主版本。 偶数版本(如 .NET 6 或 .NET 8)长期受支持 (LTS)。 LTS 版本可获得为期三年的免费支持和补丁。 奇数版本是标准期限支持。 标准期限支持版本可获得 18 个月的免费支持和补丁。

版本控制详细信息

.NET 运行时具有用于版本控制的 major.minor.patch 方法,且该方法遵循语义版本控制

但是,.NET SDK 不遵循语义版本控制。 .NET SDK 发布速度更快,其版本必须显示相应的运行时和 SDK 自己的次要版本及补丁版本。

.NET SDK 版本号的前两个位置与它发布的 .NET 运行时版本匹配。 SDK 的每个版本都可以为此运行时或任何较低版本创建应用程序。

SDK 版本号的第三个位置传达次要版本编号和修补编号。 次要版本乘以 100。 最后两个数字表示补丁号。 次要版本 1,修补程序版本 2 将表示为 102。 例如,以下是可能的运行时和 SDK 版本号的序列:

改变 .NET 运行时 .NET SDK \ 注释
初次发布 5.0.0 5.0.100 初始版本。
SDK 补丁 5.0.0 5.0.101 运行时未使用此 SDK 修补程序进行更改。 SDK 补丁会将 SDK 补丁版本中的最后一位数字增加。
运行时和 SDK 修补程序 5.0.1 5.0.102 运行时补丁会提升运行时补丁编号。 SDK 补丁会将 SDK 补丁版本中的最后一位数字增加。
SDK 功能更改 5.0.1 5.0.200 运行时补丁未更改。 新的 SDK 功能会将 SDK 补丁版本中的第一位数字增加。
运行时补丁 5.0.2 5.0.200 运行时补丁会提升运行时补丁编号。 SDK 不会更改。

在上表中可以看到多个策略:

  • 运行时和 SDK 共享主要版本和次要版本。 给定 SDK 和运行时的前两个数字应匹配。 上述所有示例都是 .NET 5.0 发布流的一部分。
  • 只有当运行时更新时,运行时的补丁版本才会更新。 SDK补丁版本号不会在运行时补丁中更新。
  • 仅当 SDK 更新时,SDK 的修补程序版本才会更新。 运行时修补程序可能不需要 SDK 修补程序。

注意:

  • 如果 SDK 在运行时功能更新之前有 10 个功能更新,则版本号将滚动到 1000 系列。 版本 5.0.1000 将遵循版本 5.0.900。 这种情况不会发生。
  • 不会出现为发布功能的 99 修补程序版本。 如果发布版本接近此数字,就会强制进行功能发布。

可以在 dotnet/designs 存储库中查看初始建议的更多详细信息。

语义化版本控制

.NET 运行时 大致遵循 语义版本控制(SemVer),采用 MAJOR.MINOR.PATCH 版本控制,使用版本号的各个部分来描述更改的程度和类型。

MAJOR.MINOR.PATCH[-PRERELEASE-BUILDNUMBER]

可选的 PRERELEASEBUILDNUMBER 部件从不属于受支持版本的一部分,仅存在于每夜构建、源码目标的本地构建以及不支持的预览版本中。

运行时版本号更改

  • MAJOR 每年递增一次,可以包含:

    • 产品或新产品方向的重大更改。
    • API 引入了重大变更。 接受中断性变更存在较大障碍。
    • 采用了现有依赖项的较新 MAJOR 版本。

    主版本每年发布一次,偶数版本是长期支持的 (LTS) 版本。 使用此版本控制方案的第一个 LTS 版本是 .NET 6。 最新的非 LTS 版本为 .NET 9。

  • MINOR 在以下情况下递增:

    • 添加了公共 API 接口范围。
    • 添加了新行为。
    • 采用了现有依赖项的较新 MINOR 版本。
    • 引入了新的依赖项。
  • PATCH 在以下情况下递增:

    • 进行了 Bug 修复。
    • 添加了对较新的平台的支持。
    • 采用了现有依赖项的较新 PATCH 版本。
    • 任何其他更改都不符合上述情况之一。

当有多个更改时,受单个更改影响的最高元素将递增,以下元素将重置为零。 例如,当 MAJOR 递增时,MINOR.PATCH 被重置为零。 当MINOR递增时,PATCH被重置为零,而MAJOR保持不变。

文件名中的版本号

为 .NET 下载的文件带有版本,例如 dotnet-sdk-5.0.301-win-x64.exe

预览版本

预览版本会在版本号后附加-preview.[number].[build]。 例如,6.0.0-preview.5.21302.13

服务版本

在版本发布后,版本分支通常停止生成日常版本,而开始生成服务版本。 服务版本向版本追加了 -servicing-[number]。 例如,5.0.1-servicing-006924

.NET 运行时兼容性

.NET 运行时维护版本之间的高度兼容性。 升级到新的 .NET 主要运行时版本后,大体上,.NET 应用程序应继续正常工作。

每个主要的 .NET 运行时版本都包含有意、仔细审查和记录的重大更改。 记录的破坏性变更并不是升级后可能影响应用程序的唯一问题来源。 例如,.NET 运行时的性能改进(不被视为重大变更)可能会揭示潜在的应用线程错误,从而导致应用程序在该版本上无法正常运行。 预期大型应用在升级到新的 .NET 运行时主版本后需要进行一些修复。

默认情况下,.NET 应用配置为在给定的 .NET 运行时主版本上运行,因此强烈建议重新编译以在新的 .NET 运行时主版本上运行应用。 然后在升级后重新测试应用,以识别任何问题。

假设通过应用重新编译进行升级不可行。 在这种情况下,.NET 运行时提供了 其他设置 ,使应用能够在比编译时版本更高的主 .NET 运行时版本上运行。 这些设置不会更改将应用升级到更高主 .NET 运行时版本所涉及的风险,并且升级后仍需要重新测试应用。

.NET 运行时支持加载面向较旧 .NET 运行时版本的库。 升级到较新的主 .NET 运行时版本的应用可以引用面向较旧 .NET 运行时版本的库和 NuGet 包。 无需同时升级应用引用的所有库和 NuGet 包的目标运行时版本。

另请参阅