npm install 生成的 package-lock.json 有什么用
根据 官方文档,这个package-lock.json 是在 npm install
时候生成一份文件,用以记录当前状态下实际安装的各个npm package的具体来源和版本号,按照这个package-lock.json所标示的具体版本下载依赖库包,就能确保所有库包与你上次安装的完全一样。
它有什么用呢?因为npm
是一个用于管理package之间依赖关系的管理器,它允许开发者在pacakge.json中间标出自己项目对npm各库包的依赖。你可以选择以如下方式来标明自己所需要库包的版本
这里举个例子:
"dependencies": {
"@types/node": "^8.0.33",
},
这里面的 向上标号^是定义了向后(新)兼容依赖,指如果 types/node的版本是超过8.0.33,并在大版本号(8)上相同,就允许下载最新版本的 types/node库包,例如实际上可能运行npm install时候下载的具体版本是8.0.35。
大多数情况这种向新兼容依赖下载最新库包的时候都没有问题,可是因为npm是开源世界,各库包的版本语义可能并不相同,有的库包开发者并不严格遵守这一原则:相同大版本号的同一个库包,其接口符合兼容要求。这时候用户就很头疼了:在完全相同的一个nodejs的代码库,在不同时间或者不同npm下载源之下,下到的各依赖库包版本可能有所不同,因此其依赖库包行为特征也不同有时候甚至完全不兼容。
因此npm最新的版本就开始提供自动生成package-lock.json功能,为的是让开发者知道只要你保存了源文件,到一个新的机器上、或者新的下载源,只要按照这个package-lock.json所标示的具体版本下载依赖库包,就能确保所有库包与你上次安装的完全一样。
它与npm-shrinkwrap.json的功能类似,如果两个package-lock.json和npm-shrinkwrap.json存在于包的根,package-lock.json将被完全忽略。
npm 是真么根据package.json版本号确定版本的
首先,说一下版本号的格式:主版本号.次版本号.修订号。例 1.6.5
版本号递增规则如下:
主版本号:当你做了不兼容的 API 修改
次版本号:当你做了向下兼容的功能性新增
修订号:当你做了向下兼容的问题修正
先行版本号及版本编译元数据可以加到“主版本号.次版本号.修订号”的后面,作为延伸。例 1.6.4-alpha
package.json 中常见的^
,~
等符合语义化版本控制规范,具体版本匹配如下:
1.2.3 - 2.3.4 匹配版本 >=1.2.3 <=2.3.4
1.x 匹配版本 >=1.0.0 <2.0.0
1.2.x 匹配版本 >=1.2.0 <1.3.0
~1.2.3 匹配版本 >=1.2.3 <1.3.0
^1.2.3 匹配版本 >=1.2.3 <2.0.0
具体可查 官方文档>>
一个npm包的更多版本信息,可以执行 npm view <packagename>
查看,如下所示
如何更新 package-lock.json
- 如果用
npm
新增或者删除模块,会更新package-lock.json
文件 - 如果只是想更新一下
package-lock.json
,那么直接删除文件,运行npm install
,就可以重新生成一份文件
package-lock.json 不是万能的
存在一些情况,执行 npm i
并不会完全按照 package-lock.json
的版本下载,例如:
package.json:^1.1.0
package-lock.json:1.1.4
available:1.1.9
- package-lock.json 中缺少package.json中的包(很少见)
为了解决这些问题,npm 5.7 版本以上 可以执行 npm i package -E
就只按照package-lock.json
的内容,而不考虑 package.json
.