亲宝软件园·资讯

展开

package.json与package-lock.json

我只是想饮一杯奶茶 人气:0

package.json

记录当前项目所依赖模块的版本信息,更新模块时锁定模块的大版本号(版本号的第一位),不能锁定后面的小版本,

package-lock.json

package-lock.json 是在 `npm install`时候生成一份文件。记录了node_modules目录下所有模块(包)的名称、版本号、下载地址、及这个模块又依赖了哪些依赖。

两者区别:

npm5以前

npm5以前,没有package-lock.json这个文件。package.json文件会记录你项目中所需要的所有模块。当你执行npm install的时候,node会先从package.json文件中读取所有dependencies信息,然后根据dependencies中的信息与node_modules中的模块进行对比,没有的直接下载,已有的检查更新。

因为package.json只能锁定模块的大版本号(版本号的第一位),不能锁定后面的小版本,所以你每次重新npm install时候拉取的都是该大版本下面最新的版本。一般我们为了稳定性考虑我们不能随意升级依赖包,因为如果换包导致兼容性bug出现很难排查,这样很容易出现问题,所以package-lock.json就是来解决包锁定不升级问题的

另外,package.json文件只记录你通过npm install方式安装的模块信息,而这些模块所依赖的其他子模块的信息不会记录。

npm5以后

package-lock.json文件锁定所有模块的版本号,包括主模块和所有依赖子模块。当你执行npm install的时候,node从package.json文件读取模块名称,从package-lock.json文件中获取版本号,然后进行下载或者更新。

因此,正因为有了package-lock.json文件锁定版本号,所以当你执行npm install的时候,node不会自动更新package.json文件中的模块,必须用npm install packagename@x.x.x(指定版本号)来进行安装才会更新,package-lock.json文件中的版本号也会随着更新。

package-lock.json的作用

如果重新 npm install 的时候以及当node_modules文件夹并不存在或被删除时,需要用到npm install重新装载全部依赖时,通过package-lock.json可以直接表明下载地址和相关依赖,就无需再从package.json逐个分析包的依赖项,因此会大大加快安装速度,package-lock.json目的就是确保所有库包与你上次安装的完全一样。        

如果要升级package-lock.json里面的库包

npm install XXX@x.x.x  

补充:关于package-lock.json的详细解释

关于package-lock.json的解释

npm官方文档: http://caibaojian.com/npm/files/package.json.html

Node.js v8.0 后,自带的 npm 也升级到了5.0的确带来了不少便利,大概讲一下 npm 5 的一些大的变化:

package-lock.json文件的产生:

以下是 package-lock.json 文件的例子:

package-lock.json是当 node_modules 或 package.json发生变化时自动生成的文件。这个文件主要功能是确定当前安装的包的依赖,以便后续重新安装的时候生成相同的依赖,而忽略项目开发过程中有些依赖已经发生的更新

{
"name": "test_pkg_lock",
"version": "1.0.0",
"lockfileVersion": 1,
"dependencies": {
"commander": {
"version": "2.9.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
"integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q="
},
"cssfilter": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.8.tgz",
"integrity": "sha1-ZWTKzLqKdt2bS5IGaLn7f9pQ5Uw="
},
"graceful-readlink": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
"integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU="
},
"xss": {
"version": "0.2.18",
"resolved": "https://registry.npmjs.org/xss/-/xss-0.2.18.tgz",
"integrity": "sha1-bfX7XKKL3FHnhiT/Y/GeE+vXO6s="
}
}}

带来速度的同时,npm 也挖了个大大的坑:

以后直接改 package.json 文件相应模块的版本号,再执行npm install不会更新了(好可怕),你只能手动用npm install xxx@yy指定版本号来安装,然后它会自动更新 package-lock.json 文件。直接执行npm install时,如果不存在 package-lock.json 文件,它会根据安装模块后的 node_modules 目录结构来创建;如果已经存在 package-lock.json 文件,则它只会根据 package-lock.json 文件指定的结构来下载模块,并不会理会 package.json 文件

网上已经有很多人反应这个问题了:GitHub 上的 issue:package-lock.json file not updated after package.json file is changed

clean project with some deps in package.json.you run npm imodules are
installed and package-lock.json file is created.say you update module
A in package.json file.you run npm i. I would expect this updates the
package-lock.json file but it doesn’t. which results in module A not
being updated.

总结

加载全部内容

相关教程
猜你喜欢
用户评论