100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > npm semver理解以及package-lock.json的探索

npm semver理解以及package-lock.json的探索

时间:2020-07-30 02:10:49

相关推荐

npm semver理解以及package-lock.json的探索

文章目录

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。

参考文档

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。