版本号格式不陌生吧,.NET 传统的版本号格式类似这样 1.5.1254.0。本文将推荐一种新的版本号格式——语义版本号,格式类似这样 1.4.6-beta。我推荐语义版本号是因为这样的版本号自包含语义,而且这样的语义能够在版本库中体现出来。


传统的版本号

如果你只是知道传统版本号由四个部分组成,那么建议去官方文档 Assembly Versioning 了解一下这种版本号的定义。它分为 主版本号.次版本号.构建号.修订号 四个部分,但是后面的一个或多个部分可以省略。

例如,1.5.1254.0 表示主版本号是 1,次版本号是 5;在 1.5 的版本下,第 1255 次构建,并且在这次构建之后没有进行修订。如果你是一个库的发布者,那么主版本号的改变意味着 API 出现不兼容的修改;次版本号改变意味着 API 出现兼容的修改(通常是新增)。

然而我们如何能够准确地向所有人传递这样的版本规则呢?当我们在向全世界提供一个库(比如 NuGet 包)的时候,我们怎么让团队所有人都知道我们正在为哪个版本开发新功能呢?我们又应该在何时更新程序集或者 NuGet 的版本号呢(在功能开发开始?差不多完成?临近发布?)?

传统的版本号记录不了这些信息,于是我们不得不用一些额外的方式来记录,这就增加了维护成本。

语义版本号

语义版本号由五个部分组成 主版本号次版本号补丁号预发布版本标签构建号。举例看看语义版本号是什么样的吧(摘自 NuGet Package Version Reference):

  • 1.0.1
  • 1.0.1-rc
  • 1.0.1-beta
  • 1.0.1-alpha2
  • 1.0.1-alpha
  • 1.0.1-aaa

NuGet 4.3.0 以上,并且 Visual Studio 2017 的 15.3 以上版本开始支持语义版本号 2.0(Semantic Versioning 2.0.0)。

  • 1.0.0-alpha.1

    • 2.0 版本的语义版本号在预发布标签后面使用 . 来区分预发布的不同版本,这样就能避免 alpha2 在字符串比较上大于 alpha10 的问题。(否则得写成 alpha02 了。)
  • 1.0.0+githash
    • 2.0 版本的语义版本号在最后使用 + 来表示 git 版本库相关的信息,这样为持续集成(CI)时自动生成版本号提供了方便。
  • 1.0.0-beta.5+4
    • 表示这是准备发布 1.0.0 的第 5/6 个 beta 版本之后,又新增了 4 个 git 提交。(是不是意义更加明确?)

如何在项目中使用语义版本号?

如果你希望方便,在执行 dotnet builddotnet pack 命令之后能够直接得到使用语义版本号的 NuGet 包,那么你必须拥有一个新格式的 csproj,就是 .NET Core 带来的那种新格式。如果你的格式是旧的,可以阅读我的另一篇文章 将 WPF、UWP 以及其他各种类型的旧样式的 csproj 文件迁移成新样式的 csproj 文件 迁移成新格式。

这样,在 csproj 文件中将版本号写为以下方式即可:

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><Version>1.6.2-beta</Version><!-- <PackageId>Walterlv.DemoPackage</PackageId> --><!-- <TargetFrameworks>netstandard2.0;net471</TargetFrameworks> --></PropertyGroup>
</Project>

你还可以考虑在编译的时候进行改变,即执行编译命令的时候传入版本号:

# 以下三种都行
> dotnet build /p:Version=1.6.2-beta
> dotnet msbuild /p:Version=1.6.2-beta
> msbuild /p:Version=1.6.2-beta

当然,你还可以使用响应文件来简化参数,详情可阅读我的另一篇博客 使用 MSBuild 响应文件 (rsp) 来指定 dotnet build 命令行编译时的大量参数。

如果希望自动化地在项目中生成语义版本号,可阅读我的另一篇博客 使用 GitVersion 在编译或持续构建时自动使用语义版本号(Semantic Versioning)。


参考资料

  • Semantic Versioning 2.0.0 - Semantic Versioning
  • Semantic Versioning & auto-incremented NuGet package versions - Xavier Decoster
  • NuGet Package Version Reference - Microsoft Docs
  • Pre-release versions in NuGet packages - Microsoft Docs
  • Versioning NuGet packages in a continuous delivery world: part 1 – Microsoft DevOps Blog
  • Versioning NuGet packages in a continuous delivery world: part 3 – Microsoft DevOps Blog
  • Supporting Semantic Versioning 2.0.0

语义版本号(Semantic Versioning)相关推荐

  1. npm包的语义版本控制(Semantic Versioning of Packages)

    本文删改自Node.js 8 the Right Way Part I Chapter 3 npm 使用语义版本控制(SemVer)来寻找包的最佳可用兼容版本. 以安装测试框架mocha为例 $ ​​ ...

  2. QIIME 2教程. 27语义类型Semantic(2021.2)

    语义类型 Semantic types https://docs.qiime2.org/2021.2/semantic-types 所有的QIIME 2的对象(documentation)都定义了语义 ...

  3. QIIME 2教程. 27语义类型Semantic(2020.11)

    文章目录 语义类型 为什么定义语义类型 常用的语义类型 译者简介 Reference 猜你喜欢 写在后面 语义类型 Semantic types https://docs.qiime2.org/202 ...

  4. 从语义(semantic)GIS和知识表达谈起

    语义(semantic)及其语义Web 首先谈语义,个人理解,语义就是具有意义的信息,例如我们单独说"b-u-s",是没有任何意义的,但如果我们说"bus",在 ...

  5. OpenCV语义分割semantic segmentation的实例(附完整代码)

    OpenCV语义分割semantic segmentation的实例 OpenCV语义分割semantic segmentation的实例 OpenCV语义分割semantic segmentatio ...

  6. 知识库的构建 6-1 语义网 Semantic Web

    总结:关于URI的构成,命名空间,命名空间prefix,curie,turtle,关于RDFa 语义网Semantic web:目的是想构建一个web使所有的data都有一个标准的格式 RDF Res ...

  7. 关于 Sem Ver(semantic versioning)

    Semantic Versioning 今天在阅读相关书籍是看到了 Semantic Versioning ,原来每个数字都有其特殊的含义啊, 之前项目的版本迭代,一直用BUILD_VERSION 去 ...

  8. Semantic Versioning

    软件版本如何表示的问题 引入 Rust 依赖发现的版本如何表示 Cargo understands Semantic Versioning (sometimes called SemVer), whi ...

  9. 语义化版本(semantic versioning)机制里的一些范围标识符

    https://semver.npmjs.com/ carat(hat) symbol 就是键盘数字6上面的这个符号:^ include everything greater than a parti ...

最新文章

  1. Transformer中的位置编码(PE,position)
  2. MySQL 数据库规范--调优篇(终结篇)
  3. AJAX-prototype.js实现Ajax
  4. 【译】gRPC vs HTTP APIs
  5. 【转】大话程序猿眼里的高并发
  6. Python 进阶 —— 迭代器与生成器
  7. 监测wifi连接_超声波传感器在物联网河流水位监测过程中扮演重要角色
  8. 蓝桥杯2016年第七届C++省赛B组第一题-煤球数目
  9. Dezender的使用
  10. linux之scp命令学习
  11. ubuntu挂载移动硬盘时提示Unable to mount
  12. 自动驾驶基础——惯性测量单元(IMU)
  13. 应用程序池是个什么东东?
  14. No buffer space available 和windows 2003复制文件时:配额不足,无法处理该命令
  15. 计算机测色配色应用,计算机测配色方法及注意事项
  16. linux wall命令_如何在Linux上使用wall命令
  17. 给大家分享下做短视频运营的干货
  18. Openfire使用总结
  19. Android Studio 配置 Copyright 插入版权声明
  20. ppt生成eps文件_如何将AI/EPS格式文件转为ppt格式

热门文章

  1. Linux Deploy搭建移动渗透系统
  2. Auto.js学习笔记2:真机连接vscode开发工具进行调试,自动开启微信app,自动切换通讯录和微信界面
  3. debug信息的认识
  4. 基于单片机智能数字温度采集报警器系统设计-毕设课设资料
  5. JS 异步编程的解决方案,以及回调地狱的解决方案
  6. 三大集合:List、Map、Set
  7. 火山PC(火山视窗)图形按钮制作器教程
  8. 问题:EO-1 hyperion影像做 MNF 时报错问题解决
  9. 什么是微波信号发生器
  10. python找最长的单词,Python 找出英文单词列表(list)中最长单词链