版本控制

软件库在版本 1.0 中很少完成。 良好的库会随着时间推移而发展,添加功能,修复 bug 并改进性能。 请务必在不中断现有用户的情况下发布 .NET 库的新版本。

中断性变更

关于处理版本间重大变更的信息,请参阅 重大变更

版本号

.NET 库有许多方法来指定版本。 这些版本是最重要的:

NuGet 包版本

NuGet 包版本 显示在 NuGet.org 和 Visual Studio NuGet 包管理器上,并在使用包时添加到源代码中。 NuGet 包版本是用户通常会看到的版本号,当他们谈论正在使用的库版本时,他们将引用它。 NuGet 包版本由 NuGet 使用,对运行时行为没有影响。

<PackageVersion>1.0.0-alpha1</PackageVersion>

NuGet 包标识符与 NuGet 包版本结合使用,用于标识 NuGet 中的包。 例如,Newtonsoft.Json + 11.0.2。 带后缀的包是预发行版包,具有特殊行为,非常适合进行测试。 有关详细信息,请参阅 预发行版包

由于 NuGet 包版本是开发人员最可见的版本,因此最好使用 语义版本控制(SemVer)对其进行更新。 SemVer 指示版本之间的更改的重要性,并帮助开发人员在选择要使用的版本时做出明智的决策。 例如,从 1.02.0 表示可能存在重大更改。

✔️ 请考虑使用 SemVer 2.0.0 对 NuGet 包进行版本控制。

✔️ 请使用公共文档中的 NuGet 包版本,因为它是用户通常会看到的版本号。

✔️ 在发布不稳定的包时,请包含预发行后缀。 (有关将 API 标记为预览版或实验性 API 的详细信息,请参阅 预览版 API。)

用户必须选择获取预发行版包,以便他们了解包未完成。

程序集版本

程序集版本是 CLR 在运行时用来选择要加载的程序集版本。 使用版本控制选择程序集仅适用于具有强名称的程序集。

<AssemblyVersion>1.0.0.0</AssemblyVersion>

.NET Framework CLR 要求完全匹配以便加载具有强名称的程序集。 例如,Library1, Version=1.0.0.0 是参考了 Newtonsoft.Json, Version=11.0.0.0进行编译的。 .NET Framework 将仅加载确切的版本 11.0.0.0。 若要在运行时加载其他版本,必须将绑定重定向添加到 .NET 应用程序的配置文件。

与程序集版本组合使用的强命名启用严格的程序集版本加载。 虽然强命名库具有很多好处,但通常会导致出现找不到程序集的运行时异常,并且在要修复的 app.configweb.config需要绑定重定向。 在 .NET(Core)中,程序集加载更加宽松。 .NET (Core) 运行时会在运行时自动加载具有更高版本的程序集。

✔️ 请考虑在 AssemblyVersion 中仅包括主版本。

例如,库 1.0 和库 1.0.1 都具有 1.0.0.0的 AssemblyVersion,而库 2.0 的 AssemblyVersion 为 2.0.0.0。 当程序集版本更改频率较低时,它会减少绑定重定向。

✔️ 请考虑使 AssemblyVersion 的主版本号和 NuGet 包版本保持同步。

AssemblyVersion 包含在向用户显示的一些信息性消息中,例如,异常消息中的程序集名称和程序集限定类型名称。 维护版本之间的关系向开发人员提供有关其使用的版本的详细信息。

❌ 没有固定的 AssemblyVersion。

尽管未更改的 AssemblyVersion 可避免绑定重定向,但这意味着只能在全局程序集缓存(GAC)中安装程序集的单个版本。 此外,如果另一个应用程序使用中断性变更更新 GAC 程序集,则引用 GAC 中的程序集的应用程序将中断。

程序集文件版本

程序集文件版本用于在 Windows 中显示文件版本,对运行时行为没有影响。 设置此版本是可选的。 它在 Windows 资源管理器中的“文件属性”对话框中可见:

<FileVersion>11.0.2.21924</FileVersion>

Windows 资源管理器

✔️ 请考虑包括持续集成内部版本号作为 AssemblyFileVersion 修订号。

例如,您正在构建项目的版本 1.0.0,持续集成构建号为 99,所以 AssemblyFileVersion 为 1.0.0.99。

✔️ 请对文件版本使用 Major.Minor.Build.Revision 格式。

虽然 .NET 从未使用过文件版本,但 windows 预期文件版本 采用 Major.Minor.Build.Revision 格式。 如果版本不遵循此格式,则会引发警告。

程序集信息性版本

程序集信息版本用于记录其他版本信息,对运行时行为没有影响。 设置此版本是可选的。 如果使用的是源链接,则将在具有 NuGet 包版本以及源代码管理版本的内部版本上设置此版本。 例如,1.0.0-beta1+204ff0a 包括用于生成程序集的源代码的提交哈希。 有关详细信息,请参阅 源链接

<InformationalVersion>The quick brown fox jumped over the lazy dog.</InformationalVersion>

注意

如果此版本不遵循格式 Major.Minor.Build.Revision,则较早版本的 Visual Studio 会引发生成警告。 可以安全地忽略该警告。

❌ 避免自行设置程序集信息版本。

允许 SourceLink 自动生成包含 NuGet 和源代码管理元数据的版本。