背景

版本号是用于逐渐演进软件的过程中和其使用者之间订立的一套公共规定,Semantic Versioning 语义化版本号则是版本号具体如何约定的一套公共约定。咱们在日常的软件生产过程中,不单只产出软件自身,还会产出一些可供复用的代码包。这些代码包糅合集成在一起从而产出一个残缺的软件及零碎,期间代码包依旧会持续研发增加新个性或是修复旧有问题。在这个趋势之下,基于语义化版本号规定就能更好的细化软件生产及迭代,使软件资产能有序地更新及公布。

版本号根本是由三位数字组成:   1   .   0   .   0[MAJOR].[MINOR].[PATCH]

三位数字别离代表不同意思:

  • MAJOR 进行不兼容的API更改时的版本
  • MINOR 以向后兼容的形式增加性能时的版本
  • PATCH 向后兼容的谬误修复程序的版本

具体内容倡议去具体查看 Semantic Versioning 语义化版本号 公约。

问题

团队将局部人手操作交付给CI/CD工具,比方此文探讨的软件公布的版本的问题。目前软件公布过程是基于人手间接批改package.json文件中的version字段来实现版本的更新。在前端开始模块化治理各种公共模块后,将会产出大量的代码包须要保护。把一些人为的操作交付给机器,让机器帮忙前端共事解决局部反复的工作,也能无效缩小这些环节中的人为谬误。

解决办法

前端目前的代码包管理工具npm,自身有提供命令工具帮忙编码人员解决版本升级的工作。上面是代码:

$ npm version [<newversion> | major | minor | patch | premajor | preminor | prepatch | prerelease [--preid=<prerelease-id>] | from-git]'npm [-v | --version]' to print npm version'npm view <pkg> version' to view a package's published version'npm ls' to inspect current package/dependency versions

应用的规定也是遵循语义化版本号公约而设计,npm官网实际的细节可看 sermver.inc。

上面是对于版本选项的形容(假如默认版本为0.2.0):

选项形容例子阐明
major重大更新版本npm version major0.2.0 =》1.0.0
minor次要更新版本npm version minor0.2.0 =》0.3.0
patch补丁更新版本npm version patch0.2.0 =》0.2.1
premajor重大更新预公布版本npm version premajor0.2.0 =》1.0.0-0
preminor次要更新预公布版本npm version preminor0.2.0 =》0.3.0-0
prepatch补丁更新预公布版本npm version prepatch0.2.0 =》0.2.1-0
prerelease预公布版本npm version prerelease以后版本不是预公布版本的会出错
from-git拿取git的tag作为版本号设置至package.json内npm version from-gitgit的tag标签没有设置的状况下,会抛出谬误

对于prerelease的应用是存在前提。以后版本必须是预公布版本,如果不是预公布版本是会抛出谬误的,应用时须要留神。应用[--preid]提供额定参数还可用于详细描述预公布版本的作用,比方须要实现上面这种状况:

# 更新为预公布版本号$ npm version premajor --preid betav1.0.0-beta.0

内容援用至:https://docs.npmjs.com/cli/v7...

应用例子

场景1:简略应用

以后版本:0.2.0

行为:把版本更新至0.2.1,并在git中打上了v0.2.1的tag。

# 更新至新的补丁版本$ npm version patch# 打印git历史$ git logcommit 39c8ba50f0ef18aab41ac9c65669b2769ed3b3a7 (HEAD -> master, tag: v0.2.1)Author: Packy <lpreterite@126.com>Date:   Wed Apr 7 16:18:22 2021 +0800    0.2.1    

场景2:自定义git的提交内容

以后版本:0.2.0

行为:更新版本号并进行git提交,自定义提交形容。

$ npm version major -m "版本更新至%s"v1.0.0$ git logcommit 7b9e3102111f8f86fc70d1b1fcab96bb9389df9b (HEAD -> master, tag: v1.0.0)Author: Packy <lpreterite@126.com>Date:   Wed Apr 7 17:01:36 2021 +0800    版本更新至1.0.0commit eda4316722a9d03f2fd5e60f61507a6e272ddc1bAuthor: Packy <lpreterite@126.com>Date:   Wed Apr 7 11:01:20 2021 +0800    chore: 更新package

场景3:不进行git操作

以后版本:0.2.0

行为:只更改package.json文件中version字段,并不会进行git操作

# 更新至新的补丁版本,并不减少git的tag$ npm version patch --no-git-tag-version$ git logcommit eda4316722a9d03f2fd5e60f61507a6e272ddc1b (HEAD -> master)Author: Packy <lpreterite@126.com>Date:   Wed Apr 7 11:01:20 2021 +0800    chore: 更新package$ git statusOn branch masterYour branch is ahead of 'origin/master' by 6 commits.  (use "git push" to publish your local commits)Changes not staged for commit:  (use "git add <file>..." to update what will be committed)  (use "git restore <file>..." to discard changes in working directory)        modified:   package.jsonno changes added to commit (use "git add" and/or "git commit -a")