语义化版本规范

article/2025/1/11 19:54:44

1. 概念

语义化版本规范(SemVer Semantic Versioning)是 GitHub 起草的一个具有指导意义的、统一的版本号表示规范。它规定了版本号的表示、增加和比较方式,以及不同版本号代表的含义。

在这套规范下,版本号及其更新方式包含了相邻版本间的底层代码和修改内容的信息。语义化版本格式为:主版本号.次版本号.修订号(X.Y.Z),其中 XYZ 为非负的整数,且禁止在数字前方补零。

Go Modules 使用了语义版本来管理模块。每个语义版本都采用 vMAJOR.MINOR.PATCH 的形式,我们简单介绍下各字段的含义。

2. 规则

版本号可按以下规则递增:

  • v :所有版本号都以 v 开头。
  • MAJOR 主版本号:意味着有大的版本更新,一般会导致 API 和之前版本不兼容。
  • MINOR 次版本号:当做了向下兼容的功能性新增及修改。这里有个不成文的约定需要你注意,偶数为稳定版本,奇数为开发版本。
  • PATCH 修订版本号:用户做了向后兼容的 bug 修复。

你可能还看过这么一种版本号:v1.2.3-alpha。这其实是把先行版本号(Pre-release)和版本编译元数据,作为延伸加到了主版本号.次版本号.修订号的后面,格式为 X.Y.Z[-先行版本号][+版本编译元数据],如下图所示:

yuyi我们来分别看下先行版本号和版本编译元数据是什么意思。

先行版本号意味着,该版本不稳定,可能存在兼容性问题,格式为:X.Y.Z-[一连串以句点分隔的标识符] ,比如下面这几个例子:

1.0.0-alpha
1.0.0-alpha.1
1.0.0-0.3.7
1.0.0-x.7.z.92

编译版本号,一般是编译器在编译过程中自动生成的,我们只定义其格式,并不进行人为控制。下面是一些编译版本号的示例:

1.0.0-alpha+001
1.0.0+20130313144700
1.0.0-beta+exp.sha.5114f85

注意,先行版本号和编译版本号只能是字母、数字,且不可以有空格

如果两个版本具有相同的主版本号,那么预期更高版本则可以向后兼容较低版本。但是,如果两个版本的主版本号不同,那么它们之间就没有预期的兼容关系。

下面这张图展示了 Go 处理版本更新的方法。my/thing/v2 标识的是特定模块的语义主版本 2。版本 1 是 my/thing,模块路径中没有明确的版本。但是,当用户引入主要版本 2 或更大版本时,必须在模块名称后添加版本,以区别于版本 1 和其他主要版本,所以版本 2 为 my/thing/v2,版本 3 为 my/thing/v3,依此类推。

version
假设模块 A 引入了模块 B 和模块 C,模块 B 引入了模块 D v1.0.0,模块 C 引入了模块 D v2.0.0。如下所示:


A --> 模块B --> 模块D v1.0.0
A --> 模块C --> 模块D v2.0.0

由于 v1 和 v2 模块的路径不相同,所以他们是互不干扰的两个模块,可以共存。执行 go list,进一步确认模块 v1 与 v2 是共存的。


~/mathlib(master*) » go list -m all | grep mydiv
github.com/dreamerjackson/mydiv v1.0.1
github.com/dreamerjackson/mydiv/v2 v2.0.1

3. 规范

  • 标记版本号的软件发行后,禁止改变该版本软件的内容,任何修改都必须以新版本发行。
  • 主版本号为零(0.y.z)的软件处于开发初始阶段,一切都可能随时被改变,这样的公共 API 不应该被视为稳定版。1.0.0 的版本号被界定为第一个稳定版本,之后的所有版本号更新都基于该版本进行修改。
  • 修订号 Zx.y.Z | x > 0)必须在只做了向下兼容的修正时才递增,这里的修正其实就是 Bug 修复。
  • 次版本号 Yx.Y.z | x > 0)必须在有向下兼容的新功能出现时递增,在任何公共 API 的功能被标记为弃用时也必须递增,当有改进时也可以递增。其中可以包括修订级别的改变。每当次版本号递增时,修订号必须归零。
  • 主版本号 XX.y.z | X > 0)必须在有任何不兼容的修改被加入公共 API 时递增。其中可以包括次版本号及修订级别的改变。每当主版本号递增时,次版本号和修订号必须归零。

4. 如何确定版本号

  • 在实际开发的时候,建议你使用 0.1.0 作为第一个开发版本号,并在后续的每次发行时递增次版本号。
  • 当我们的版本是一个稳定的版本,并且第一次对外发布时,版本号可以定为 1.0.0
  • 当我们严格按照 Angular commit message 规范提交代码时,版本号可以这么来确定:
  1. fix 类型的 commit 可以将修订号 +1。
  2. feat 类型的 commit 可以将次版本号 +1。
  3. 带有 BREAKING CHANGEcommit 可以将主版本号 +1。

5. 伪版本

当我们引入了一个没有用语义版本管理的模块,或者我们希望用某一个特殊的 commit 快照进行测试时,导入模块的版本会是伪版本,例如:v0.0.0-20191109021931-daa7c04131f5 就是一个伪版本。伪版本包含了 3 个部分:

  • 基本版本前缀:通常为 vX.0.0vX.Y.Z-0vX.Y.Z-0 表明该 commit 快照派生自某一个语义版本,vX.0.0 表明该 commit 快照找不到派生的语义版本;
  • 时间戳:格式为“yyyymmddhhmmss”,它是创建 commit 的 UTC 时间;
  • 最后是长度为 12 的 commit 号。

语义版本规范完全说明


http://chatgpt.dhexx.cn/article/Kf28W2IK.shtml

相关文章

Appium:Unable to launch WebDriverAgent because of xcodebuild failure: xcodebuild failed with code 65

Appium运行异常记录: Unable to launch WebDriverAgent because of xcodebuild failure: xcodebuild failed with code 65 api文档: XCUITest Real Devices (iOS) Appium 官方文档 看云 参考文档:遇到 Unable to launch WebDriverAgent be…

xcodebuild: Returned an unsuccessful exit code

在执行pod repo push 的时候报了如下错误 ERROR | [iOS] xcodebuild: Returned an unsuccessful exit code. 解决方法 在命令行最后添加 --skip-import-validation pod lib lint paperShare.podspec --allow-warnings --sourceshttps://github.com/CocoaPods/Specs.git,http://…

探究 Xcode 命令行用法三:xcodebuild 打包实践(上)

本文还是 adat 项目的延伸,开始介绍打包实践。打包相关的内容繁多,作者把它分成了多篇文章,本文主要是概念部分。理解这些概念对于自己动手编写打包命令至关重要。如果你使用 fastlane、bitrise 或其他构建工具来打包,但对于某些配…

【Appium踩坑】Unable to launch WebDriverAgent because of xcodebuild failure: xcodebuild failed with code

解决 原因其实是没有启动 WebDriverAgentRunner, 解决就是启动 WebDriverAgentRunner 就行了。 详细报错 Failed to create session. An unknown server-side error occurred while processing the command. Original error: Unable to launch WebDriverAgent…

Xcode编译没问题而使用xcodebuild命令却生成失败

可能大家在项目开发中有时会遇到这样的问题: 明明在Xcode工具中编译没问题,但当使用xcodebuild命令时却无法正常打包,这是为什么呢? 一、错误 比如,一个错误如下: xxx/ViewController.swift:339:15: warn…

探究 Xcode 命令行用法二:xcodebuild 测试实践

本文还是 adat 项目的延伸,瞄准开发周期的测试环节,主要介绍 Xcode 范畴内的测试概念和自动化测试实践,不会讨论如何编写高质量的测试用例。文中涉及到 Xcode 构建的许多概念,大部分已在前两篇文章中有所说明,建议先大…

如何让php执行xcodebuild,Xcodebuild命令使用

Xcode-select命令 xcode-select是Mac系统自带的命令行工具,属于用户系统内/usr/bin。当电脑上安装多个Xcode时,xcode-select用来选择命令行工具为哪一个版本的Xcode服务。 命令行工具安装指令:xcode-select --install 选择指定的Xcode路径&am…

iOS 自动构建命令——xcodebuild

想想当初天天来到公司,每天需要做一件事就是打开Xcode打包ipa,上传到fir。日复一日月复一月年复一年的做着同样的事情,作为有志成为优秀工程师的我来说,这是必须要解决的问题,所以决定自动化解决问题。 简介 xcodebu…

iOS开发-思维导图(初级)

简介:本脑图只整理了一些自认为比较基础的东西(比较主观),可能适用于部分初学者,对于正在进阶的小伙伴参考意义可能不大哦~😁 如果有小伙伴觉得哪些知识也需要加到图中,欢迎评论区留言&#xff…

IOS开发之证书

分别为证书、appID、设备、描述文件 一、证书Certificates 证书类型: Software:开发证书(程序员开发app)、分发证书(真机调试)、发布证书(正式发布) Services:通知证书&…

怎么学习iOS,如何学习iOS开发?

近年来ios app开发在不断发展中,各中小型也如雨后春笋纷纷露头,像广州商侣软件公司这样的app开发企业可以说是处处可见,然而ios app开发到底该如何入手,如何才能如鱼得水般在这个领域里面畅游呢? 一、什么是ios app开发 ios app开发是指针对苹果公司所生产的手机的ios系统…

零基础学习 iOS 开发

作者:匿名用户 链接:https://www.zhihu.com/question/22000647/answer/114700565 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 作为一名混迹iOS开发圈近4年的码农,资历不深不浅&a…

IOS小白入门指南

加入ios 项目已经一个多月了,本篇文章主要介绍IOS开发入门的一些基础知识,帮助想学习iOS开发的人更有效率地学习。 目录 需要的计算机基础 开发语言选择 IOS两种开发语言的异同 Objective-C和swift的相同点: 二者的不同点&#xff1a…

java ios开发_使用Java开发iOS应用

自从使用Objective C开发原生的iOS应用以来,就有许多使用别的语言来开发iOS应用的替选方案。比如说,下面就列出了一些: PhoneGap, 使用HTML/JS来开发 RubyMotion,使用Ruby ionic,使用AngularJS开发 我最近发现的一个的是RoboVM,你可以通过它来用Java开 自从使用Objective…

IOS开发进阶学习资料(提升必备)

最近整理了下IOS学习资料,包含了入门、进阶、性能优化、面试和学习书籍,算是比较全面的,在这里分享给大家,希望对大家有用。 先晒出IOS学习路线图,大家照着图谱修炼。 学习社区 objc中国 learn IOS Ray Wenderlich…

iOS开发进阶(二):走近iOS原生开发

文章目录 一、前言二、知识储备三、 Object-C四、启动流程五、拓展阅读 一、前言 在应用 uni-app 进行跨平台APP开发过程中,发现并不支持视频播放小窗功能,且插件市场提供的插件用户体验不好,遂决定自行开发 uni-app 原生插件。 uni-app原生…

iOS开发学习系列(1)———Swift语言入门

缘起 对于成为全栈开发者的目标而言,很好奇自己几年前怎么就没想过iOS开发的事情。iOS好歹也是移动操作系统两巨头之一。反思了下,有可能是因为之前对Object-C太无感导致的。现在趁着Swift,借这个机会重新整理iOS的开发。本系列虽然是iOS开发…

IOS开发学习资料集合(开发必备)

最近整理了下IOS学习资料,包含了入门、进阶、性能优化、面试和学习书籍,算是比较全面的,在这里分享给大家,希望对大家有用。 先晒出IOS学习路线图,大家照着图谱修炼。 学习社区 objc中国 learn IOS Ray Wenderlich…

iOS开发学习路线

那么现在说正题,如何成为负责任的开发者? 关注作者:点击关注二字可以找到大神组织首先要负责,对自己的项目负责。如果是自己新开的项目,要保证随时都能清晰的想到项目当中每个地方是怎么实现的,测试或者用户反馈了问题以后,能立马想到可能的错误原因。 如果是接手的项目…

对项目需求管理的认识和体会

下面是对一位项目经理关于需求管理的访谈: 做了那么多个项目,我深深感到对项目的需求把握管理好了,是项目成功的关键。对需求的管理大概有那么几个活动,首先是需求获取,这是一个确定和理解客户的需要和期望的过程&…