语义版本号(Semantic Versioning)

39人阅读 评论(0) 收藏 举报
分类:

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


传统的版本号

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

AssemblyVersion

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

new Version()

然而我们如何能够准确地向所有人传递这样的版本规则呢?当我们在向全世界提供一个库(比如 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)


参考资料

查看评论

语义化版本号 Sematic Versioning

今天在看commonJS的package部分的时候,在讲到version字段的时候,建议参考Semantic Versioning作为版本号的编写标准。仔细了解了下,对版本号的写法有了一些认识,翻译其...
  • vbLittleBoy
  • vbLittleBoy
  • 2015-09-17 16:00:58
  • 1425

Semantic Versioning 语义化版本号

Semantic Versioning 语义化版本号
  • nangong666
  • nangong666
  • 2014-04-25 17:54:51
  • 203

对比语法错误、语义错误以及运行时错误

翻译人员: 铁锚 翻译日期: 2013年12月4日 原文链接: Syntactic vs. Semantic vs. Runtime Errors 下面的三个例子演示了什么是语法错误、什...
  • renfufei
  • renfufei
  • 2013-12-04 18:42:31
  • 5698

语义哈希(semanticHashing)

语义哈希(semanticHashing)是指将高维空间向量映射至低维汉明空间,并保持原空间向量相似性,使得新空间向量的汉明距离反映原空间向量相似度的哈希算法。语义哈希引入了近似的概念,认为在海量数据...
  • lynnandwei
  • lynnandwei
  • 2015-01-28 15:56:04
  • 3396

潜在语义索引(Latent Semantic Indexing)

潜在语义索引(Latent Semantic Indexing)是一个严重依赖于SVD的算法,本文转载自之前吴军老师《数学之美》和参考文献《机器学习中的数学》汇总。 ———————————— 在自...
  • u011450885
  • u011450885
  • 2015-06-15 10:27:19
  • 1752

隐含语义索引(Latent Semantic Indexing )

向量空间模型(Vector Space Model) 将文本看作是一个向量,向量中的每一维都代表某单词是否出现在文本中,使用向量空间模型的pca算法时并不做规约化,因为文本里的每一条不一定有同等的作...
  • u013802188
  • u013802188
  • 2014-11-07 23:37:14
  • 1254

关于API版本命名规范---语义化版本识别

语义化版本2.0.0一旦你定义了公共 API,你就可以透过修改相应的版本号来向大家说明你的修改。考虑使用这样的版本号格式:XYZ (主版本号.次版本号.修订号)修复问题但不影响API 时,递增修订号;...
  • PXYStyle
  • PXYStyle
  • 2016-03-07 20:25:05
  • 408

【译】潜在语义分析Latent Semantic Analysis (LSA)

目录目录 概述 Tutorial LSA的工作原理 How Latent Semantic Analysis Works 实例A Small Example Part 1 - Creating the...
  • zhzhji440
  • zhzhji440
  • 2015-08-11 19:49:04
  • 4425

海量数据挖掘MMDS week4: 推荐系统之隐语义模型latent semantic analysis

海量数据挖掘Mining Massive Datasets(MMDs) -Jure Leskovec courses学习笔记 推荐系统Recommendation System之隐语义模型latent...
  • pipisorry
  • pipisorry
  • 2015-10-19 22:35:28
  • 1517

深度学习结合SLAM的研究思路/成果整理之(二)语义SLAM & 端到端

查阅了一些资料,整理了关于语义SLAM的几篇论文。
  • u010821666
  • u010821666
  • 2017-12-13 16:23:45
  • 1287
    个人资料
    持之以恒
    等级:
    访问量: 2万+
    积分: 1074
    排名: 4万+
    文章存档
    最新评论