package-lock.json冲突及问题排查

       在合并分支的时候会遇到package-lock.json的冲突,本来刚开始没有在意,认为也没什么。但是直到package-lock.json出现了一大片的冲突时,我才觉得问题是真的有点大。
        问题排查:很大概率是node版本和npm版本的问题。然后问各组员大家的npm版本,发现有两个同事是6.x版本的,而我自己的是7.x版本的npm。经过自己的测试,使用npm i 安装,发现6.x版本的npm安装依赖(package-lock.json)如下:
在这里插入图片描述

但是7.x版本的npm安装的依赖会是有一个packages的东西,这里会把之前安装的依赖都包在这个packages里面。
在这里插入图片描述

       所以,如果一个同事安装了一个新的插件,我们用不同版本的npm去安装依赖的话,由于安装的npm版本不同,所以写入的package-lock.json内容也会不同,就会导致package-lock.json文件很多的冲突。

解决方法:

       1.统一node版本和npm版本(至少统一一个大的版本),且在需要重新安装依赖的时候,使用npm ci的命令去安装。(强烈推荐,npm ci指的是根据package-lock.json去安装对应的版本,不对这个文件做改动)
       2.使用git忽略package-lock.json(不推荐,这样子会导致不能根据安装依赖路径去安装包了)

补充-npm i 和 npm ci的区别:

npm i
● npm i 将创建node_modules 文件夹并安装所有 package.json 中的依赖。
● npm i 会更新 package-lock.json 文件(也就是这一步,导致了package-lock-json的冲突,因为npm版本的不同,导致了写入方式不同)。
       适用场景:安装新依赖或者升级已有依赖。
npm ci
● npm ci 将删除 node_modules 文件夹以确保干净的环境。
● npm ci 会依照 package-lock.json 里的依赖版本精准安装。
● npm ci 强依赖于 package-lock.json,如果 package-lock.json 不存在,npm ci 将不会工作。
       适用场景:在 CI/CD 场景中使用 npm ci 更为合适,一方面,由于 npm ci 依赖于 package-lock.json,依赖版本确保一致,不会出现线上版本和开发版本不一致而引发的问题;另一方面,首次安装时,使用 npm ci 将比 npm i 更加迅速,原因是由于 package-lock.json 的存在,不需要做依赖的版本检查以及梳理各依赖之间的关系。