前言下面我们来开发一个项目。我们都知道,为了方便项目管理,我们需要写一个版本号。开发时的初始版本号是多少?从1.0.0还是0.0.1开始?如果一个版本号是X.Y.Z,X什么时候加1,Y什么时候加1,Z什么时候加1,加1是跟小数吗?1.0.9的下一个版本应该是1.1.0吗?我们经常会看到一些带有后缀的项目版本,比如React的18.0.0-rc.3和Vue的2.7.0-alpha.12。这些是什么意思?这些后缀是固定字段还是可以自定义?SemVer规范事实上,语义版本控制并不是一个创新的想法。即使我们不知道,我们也在做类似的事情,但是一个明确的规范会让版本逻辑更清晰地传达给其他开发者。因此,Gravatars的创始人兼GitHub的联合创始人TomPreston-Werner建立了语义版本控制的规范。语义化版本简称为semver,所以本规范称为SemVer规范,规范地址为:https://semver.org/lang/zh-CN/简单说一下内容,方便大家理解:版本号的格式标准版本号必须使用X.Y.Z格式,其中X、Y、Z为非负整数,数字前禁止补零。X是主版本号,Y是次版本号,Z是修订号。英文对应的表达方式有major、minor、patch。每个元素都必须增加一个值。例如:1.9.1->1.10.0->1.11.0。主版本号为零(0.y.z)的软件处于开发的初始阶段,一切都可能随时更改。版本号1.0.0用于定义公共API的构成。增加版本号逻辑修订号Z(x.y.Z|x>0)必须仅在仅进行向后兼容性修复时增加。这里的更正是指对不正确的结果进行的内部修改。当有向后兼容的新功能时,必须增加次版本号Y(x.Y.z|x>0)。当任何公共API功能被标记为已弃用时,也必须递增。当向内部程序添加大量新功能或改进时,它也可以增加,其中可能包括修订级别更改。每次递增次要版本号时,修订号都必须清零。每当将任何不兼容的更改添加到公共API时,主版本号X(X.y.z|X>0)都必须递增。这可以包括次要版本号和修订级别更改。每次主版本号递增时,次要和修订号都必须清零。简单总结就是:当有不兼容的API变化时,则升级主版本号当以向后兼容的方式添加功能时,升级次要版本号当做向后兼容的缺陷修复时,然后升级修订号关于以前的版本的以前的版本号可以在修订后标出,后面跟一个连字符和一系列用句点分隔的标识符来修改。标识符必须由ASCII字母数字和连字符组成,并且不得留空。数字标识符禁止前导零填充,例如:1.0.0-alpha.6优先版本低于关联的标准版本,例如1.0.0-alpha<1.0.0被标记为前面的版本号表示该版本不稳定,可能无法满足预期的兼容性需求。回答问题其实规范的内容并不多。回到开头的第一个问题:Q:在0.y.z的初期开发阶段应该如何进行版本控制?答:最简单的方法是使用0.1.0作为您的初始开发版本,并在每个后续版本中增加次要版本号。Q:如何判断什么时候发布1.0.0版本?A:当您的软件用于生产环境时,应该已经达到1.0.0版本。如果你已经有用户依赖的稳定API,它也将是1.0.0版本。如果您担心向后兼容性,它应该是1.0.0版本。alphabeta和rc现在我们知道在之前的版本中-后面的字符是自定义的。我们经常看到一些库版本会有alpha、beta等词。以Vue为例,有3.0.0-alpha.13、3.0.0-beta.1、3.0.0-rc.1,这些是什么意思?一般来说:alpha是指内部测试版,主要用于发现bug,进行开发和测试。不建议用户下载测试版,即公测版,可以提前试用部分功能。rc是ReleaseCandidate(候选版)的缩写,意思是这个版本的功能不再增加,和最终发布版的功能一样,有点像预览版,然后可能会修正一??些小bug,并且将达到正式版。当然库也可以使用自己的版本逻辑,比如React,它也有nextversion和experimentalversion。具体的发布逻辑在React官网也有写:https://react.docschina.org/docs/release-channels.htmlnpm指定版本范围我们经常看到package.json中版本号前有~^等字符文件,例如:{"dependencies":{"react":"^1.2.3"vue":"~1.2.3",}}这些标识符的作用相信大家都有所了解,例如:^表示小版本号的更新,比如^1.2.3表示以后安装的版本>=1.2.3<2.0.0~表示修改后的版本号的更新,比如~1.2.3表示以后安装的版本>=1.2.3<1.3.0当然具体逻辑会更复杂,比如:^只会执行不改变最左边非零数的更新,所以:^0.2。3相当于>=1.2.3<2.0.0^0.0.3相当于>=0.0.3<0.0.4^1.2.3-beta.2相当于>=1.2.3-beta.2<2.0.0,其中1.2.3-beta.4可以,但是1.2.4-beta.2不行~如果minorversionnumber指定了,只会更新revisionnumber,如果没有指定,就会更新这个versionnumber,所以:~1.2.3相当于>=1.2.3<1.3.0~1.2相当于>=1.2.0<1.3.0(相当于1.2.x)~1相当于>=1.0.0<2.0.0(相当于1.x)~1.2.3-beta.2相当于>=1.2.3-beta.2<1.3.0,其中1.2.3-beta.4是可以的,1.2.4-beta.2不行除了^和~,NPM还提供了更多表示范围版本的方式:https://docs.npmjs.com/cli/v8/configuring-npm/package-json#dependencies举几个例子:{"de依赖项”:{“foo”:“1.0.0-2.9999.9999”,“bar”:“>=1.0.2<2.1.2”,“baz”:“>1.0.2<=2.3.4”,“qux”:“<1.0.0||>=2.3.1<2.4.5||>=2.5.2<3.0.0","lat":"latest",}}其中latest代表标签,在默认情况下,npm使用latest标签来标识一个包的当前版本对应我们的安装包时,也可以参考这些指定版本安装:npminstallfoo@1.2.3npminstallfoo@">=0.1.0<0.2.0"npminstallfoo@latestnpmversionnpm也提供了npm版本更新命令具体语法如下:npmversion[
