npm install 生成的 package-lock.json 有什么用

2018-08-05
JavaScript
3815

根据 官方文档,这个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

  1. 如果用npm新增或者删除模块,会更新package-lock.json文件
  2. 如果只是想更新一下package-lock.json,那么直接删除文件,运行npm install,就可以重新生成一份文件

package-lock.json 不是万能的

存在一些情况,执行 npm i 并不会完全按照 package-lock.json 的版本下载,例如:

  1. package.json:^1.1.0 package-lock.json:1.1.4 available:1.1.9
  2. package-lock.json 中缺少package.json中的包(很少见)

为了解决这些问题,npm 5.7 版本以上 可以执行 npm i package -E就只按照package-lock.json 的内容,而不考虑 package.json.