package-lock.json在多人开发时经常冲突,该如何解决才能保证线上质量?package.json如何定义才能符合我们的预期?
本文通过实验来探究包版本管理最佳实践,测试版本:node v12.20.0 (npm v6.14.8)
npm 版本是 5+,会自动生成 package-lock.json
我们用 pdfjs-dist 这个包来做测试,目前最新版 2.15.349


空项目的 package.json 如下
{
"name": "test",
"dependencies": {
}
}
安装一个新包
npm i pdfjs-dist -S
安装结果,lock 文件为 2.15.349 版本

{
"name": "test",
"requires": true,
"lockfileVersion": 1,
"dependencies": {
"dommatrix": {
"version": "1.0.3",
"resolved": "http://bnpm.byted.org/dommatrix/-/dommatrix-1.0.3.tgz",
"integrity": "sha512-l32Xp/TLgWb8ReqbVJAFIvXmY7go4nTxxlWiAFyhoQw9RKEOHBZNnyGvJWqDVSPmq3Y9HlM4npqF/T6VMOXhww=="
},
"pdfjs-dist": {
"version": "2.15.349",
"resolved": "http://bnpm.byted.org/pdfjs-dist/-/pdfjs-dist-2.15.349.tgz",
"integrity": "sha512-EeCfqj6xi4/aegKNS7Bs+TCg3Y5gmKmG0s/5xXI0PqWW66x+Nm7iFXBpVcup7HnR8sNDm+5NESfFr8T6DeWp9Q==",
"requires": {
"dommatrix": "^1.0.3",
"web-streams-polyfill": "^3.2.1"
}
},
"web-streams-polyfill": {
"version": "3.2.1",
"resolved": "http://bnpm.byted.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz",
"integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q=="
}
}
}
2.12.313 写死
{
"name": "test",
"dependencies": {
"pdfjs-dist": "2.12.313"
}
}
npm i 安装结果
pdfjs-dist 使用了固定的 2.12.313 版本
package-lock.json 结果{
"name": "test",
"requires": true,
"lockfileVersion": 1,
"dependencies": {
"pdfjs-dist": {
"version": "2.12.313",
"resolved": "http://bnpm.byted.org/pdfjs-dist/-/pdfjs-dist-2.12.313.tgz",
"integrity": "sha512-1x6iXO4Qnv6Eb+YFdN5JdUzt4pAkxSp3aLAYPX93eQCyg/m7QFzXVWJHJVtoW48CI8HCXju4dSkhQZwoheL5mA=="
}
}
}
{
"name": "test",
"dependencies": {
"pdfjs-dist": "~2.12.313"
}
}
npm i 安装结果
package-lock.json 结果没有变化,因为 lock 文件锁死
npm upate 结果也没有变化,因为 2.12 下面只有 313 一个补丁版本
{
"name": "test",
"dependencies": {
"pdfjs-dist": "^2.12.313"
}
}
npm i 安装结果
package-lock.json 因为版本锁死,依然没有变化
npm update 更新结果
package-lock.json 根据 package.json 更新到最新package.json 也相应的更新
package-lock.json 文件更新结果{
"name": "test",
"requires": true,
"lockfileVersion": 1,
"dependencies": {
"dommatrix": {
"version": "1.0.3",
"resolved": "http://bnpm.byted.org/dommatrix/-/dommatrix-1.0.3.tgz",
"integrity": "sha512-l32Xp/TLgWb8ReqbVJAFIvXmY7go4nTxxlWiAFyhoQw9RKEOHBZNnyGvJWqDVSPmq3Y9HlM4npqF/T6VMOXhww=="
},
"pdfjs-dist": {
"version": "2.15.349",
"resolved": "http://bnpm.byted.org/pdfjs-dist/-/pdfjs-dist-2.15.349.tgz",
"integrity": "sha512-EeCfqj6xi4/aegKNS7Bs+TCg3Y5gmKmG0s/5xXI0PqWW66x+Nm7iFXBpVcup7HnR8sNDm+5NESfFr8T6DeWp9Q==",
"requires": {
"dommatrix": "^1.0.3",
"web-streams-polyfill": "^3.2.1"
}
},
"web-streams-polyfill": {
"version": "3.2.1",
"resolved": "http://bnpm.byted.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz",
"integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q=="
}
}
}
package.json 文件更新结果
package.json 改为 "pdfjs-dist": "^2.12.500"{
"name": "test",
"dependencies": {
"pdfjs-dist": "^2.12.500"
}
}
npm i 安装结果
package.json 无变化package-lock.json 中更新为 2.15.349 最新版这里需要特别注意的是,从确定版本改为次版本更新的时候(2.12.313 => ^2.12.313),是不会更新 lock 文件的;
但是从次版本更新改动补丁版本(^2.12.313 => ^2.12.500),就会触发 lock 更新;


我们探索两种情况下安装新包:
npm i react -Spackage.json 文件更新结果:新增一行 "react": "^18.2.0"
package-lock.json 文件更新结果:pdfjs-dist 版本不受影响,新增 3 个 react 依赖包
{
"name": "test",
"requires": true,
"lockfileVersion": 1,
"dependencies": {
"js-tokens": {
"version": "4.0.0",
"resolved": "http://bnpm.byted.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
},
"loose-envify": {
"version": "1.4.0",
"resolved": "http://bnpm.byted.org/loose-envify/-/loose-envify-1.4.0.tgz",
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
"requires": {
"js-tokens": "^3.0.0 || ^4.0.0"
}
},
"pdfjs-dist": {
"version": "2.12.313",
"resolved": "http://bnpm.byted.org/pdfjs-dist/-/pdfjs-dist-2.12.313.tgz",
"integrity": "sha512-1x6iXO4Qnv6Eb+YFdN5JdUzt4pAkxSp3aLAYPX93eQCyg/m7QFzXVWJHJVtoW48CI8HCXju4dSkhQZwoheL5mA=="
},
"react": {
"version": "18.2.0",
"resolved": "http://bnpm.byted.org/react/-/react-18.2.0.tgz",
"integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
"requires": {
"loose-envify": "^1.1.0"
}
}
}
}
package.json 文件删除一行 "react": "^18.2.0"npm ipackage-lock.json 文件更新结果:pdfjs-dist 版本不受影响,删除 3 个 react 依赖包
package.json 改为次版本更新,但是 package-lock.json 文件依然为 2.12.313{
"name": "test",
"dependencies": {
"pdfjs-dist": "^2.12.313"
}
}
npm i react -Spackage.json 文件更新结果:新增一行 "react": "^18.2.0"{
"name": "test",
"dependencies": {
"pdfjs-dist": "^2.12.313",
"react": "^18.2.0"
}
}
package-lock.json 文件更新结果:同 「3.5.1 确定版本安装新包」,说明 lock 文件锁包的有效性package.json 允许次版本更新 "pdfjs-dist": "^2.12.313",package-lock 文件写死 2.12.313 版本cnpm i,node_modules 包没有变动rm -rf node_modules/ 删除已安装包cnpm i,node_modules 包更新到 2.15.349 最新版本,无视 package-lock.json 的锁定同时也不更新该文件
npm i,node_modules 包还原到 2.12.313 最新版本,package-lock.json 锁定有效
cnpm 不支持(忽略)依据 package-lock.json 文件安装模块,默认依赖 package.json 进行安装当两个同学都改动了 package.json 的时候,package-lock.json 文件的更新可能达到上千行的冲突,这时候如何处理?
package-lock.json,npm i 重新安装?
integrity 字段 sha-512 校验如果改错会导致安装失败package-lock.json 还原到最近一个没有冲突的版本(例如上一版 master),解决 package.json 的冲突后(这个手动解决的风险可控),npm i 自动更新 lock 文件