文章目录
semver语义化版本号锁版本机制参考文档semver语义化版本号
在软件开发中,版本号必不可少,一般而言,版本号都由三位数字构成,比如:
“vue”: “^2.5.2”
其中:
2为主版本号
,一般而言是重大功能更新,或者更新涉及到了api不兼容的情况,比如python2 python3二者不兼容。5为次版本号
,一般而言针对普通的功能更新,理论上只会有api被depriciated,但可以保证兼容性。2为补丁版本号
,一般针对bug修复等小的修改与调整
此外,我们还会看到诸如ALPHA, BETA,RELEASE, RC,等等,分别对应如下
Alpha版:一般实现了功能,但没有完整的测试,可以理解为尝鲜版;Beta版:一般是相对于Alpha版本而言比较稳定的版本,但这个版本一般不推荐用于生产环境。RC版:Release Candidate,直译过来就是发布版候选者,一般发布之前可能会有很多个候选者版本。Release版:发布版,正式版,稳定版。总之生成环境应该使用这个版本。
顺便提一句,我们可能还会遇到比如stable版本,Mainline 版本,Legacy 版本等等
mainline版本: 可以理解为开发版本,新的功能都会放到这个版本stable版本:稳定版,生产环境应使用这个版本legacy版本:历史版本,有时候你的环境版本比较低,就需要历史版本latest版本:一般是指最新稳定版,有时间我们不关心版本号,只是想使用最新稳定版,就可以指定这个。LTS 版本: 长期支持的稳定版,比如操作系统一般会提供这个版本,因为生产环境操作系统不会频繁升级,必须保证可以长期被其维护者维护。
鉴于版本号虽然复杂,但会遵守其约定这一特性,我们可以使用semver的语法来实现软件依赖版本自动升级,而且可以保证兼容性。
semver即sematic versioning的缩写,即语义化版本。即书写的版本号并不是写死的,而是可以按照语义的要求自动更新,语义主要包含:
"node": ">= 8.2.1" // 大于某一版本"node": "^8.2.1" // 次版本号和补丁版本可自动升级"node": "~8.2.1" // 补丁版本号可以自动升级 (波浪号)
除了以上的,还包括<=
,表示范围的-
,等等,可以参考官方文档,值得注意的是,版本号的自动变更会发生在以下的几种情况
明确指明命令:npm update
在没有package-lock.json
且还没有下载对应依赖的情况下执行npm install存在package-lock.json
,但在项目中.npmrc
文件中添加了package-lock=false时,安装还没有下载的依赖。
锁版本机制
语义化版本出现的意义,我个人觉得是当项目依赖了某个模块,该模块会后续不断的升级过程提升了性能也保证了兼容,那么理论上我们应该让依赖自动升级。可事实往往并非如此,尤其是api的确未发生变化,但对于某些特定逻辑会出现意想不到的问题。所以有时候为了保证系统稳定性,我们需要做一个选择,是拥抱更高的版本提供的更好的api或者性能来自动升级,还是为了保证系统稳定性不做自动升级。对此,针对于后者,npm提供了package-lock.json的锁版本机制。
事实上npm目前默认只要执行了npm install
就默认会生成一个package-lock.json
文件,可以理解为默认开启了锁版本。所以一般而言你的项目版本号是不会自动升级的。
举个例子:比如现在vue2最新版本是2.6.12。我在本地安装vue@2.6.1。
// node_modules中实际vue版本"version": "2.6.1"// package.json的vue语义化版本"dependencies": {"vue": "^2.6.1"}
接下来删除node-modules
之后再进行npm install
,即使使用了语义化版本,下载的最终版本将一直停留在2.6.1
在删除package-lock.json
或者添加.npmrc
,并设置package-lock=false
情况下,执行npm install 之后情况如下
// node_modules中实际vue版本"version": "2.6.12"// package.json的vue语义化版本"dependencies": {"vue": "^2.6.1"}
顺便说一句,删除package-lock.json并不是一个好的做法,如果想关闭锁机制,配置.npmrc才是更优雅的做法,这可以让你方便的开启关闭。
我们可以看出,package.json
的版本号在初始安装之后就不会改变,但每次实际安装的版本不锁版本的情况下都是最新的。
如果我们希望更新package.json
文件,可以使用npm update
或者npm install vue
。后者等同于执行npm install vue@latest
,当然你可以指定具体的版本号。这两个操作相当于是手动升级。
但一般而言推荐使用命令升级而不是手动去修改package.json
中文件的版本号,那样可能会触发bug。