Open Realwate opened 5 years ago
package-lock.json会记录整个依赖树的版本、目录结构、包下载的地址等,有以下几点好处。
package-lock.json
所有机器执行 npm install都能得到确定的dependencies,保证了CI,多人协作的一致性。
npm install
比如之前webpack@4.29的问题,因为本地开发环境和发布环境使用的webpack版本不同,在发布时出现webpack构建报错,这个问题可以更早的在开发环境暴露出来。
webpack
可以通过git还原某个版本的完整依赖关系,这在之前是做不到的。
git
之前如果要回退到三个月前的某个版本,虽然还原了package.json,但是因为是语义化版本(^),某些包的minor release也可能带来break change,npm install npm start后,整个项目可能根本运行不起来,不知道哪个包出了问题。
package.json
break change
npm start
npm update更新包后,提交时可以通过 diff package-lock.json更直观的看到包版本的变化。
npm update
npm可以根据 lock 跳过一些 metadata 的解析,提升安装速度。
npm
不同npm版本,执行npm i生成的lock格式略有差异(测试发现5.6,6.4,6.9三个版本都有不同的地方)。package-lock.json中记录了包的下载地址,由registry决定。 如果团队每个人使用的 npm 版本和 registry 都不相同的话,在没有更新包版本的情况下,lock 文件也会经常变化更新,可能会产生不必要的冲突。
npm i
registry
所以统一一下,使用 npm@6.9.0,淘宝源。
# 查看当前registry npm config get registry # 手动设置registry npm config set registry https://registry.npm.taobao.org # 因为publish还是要发布到npm源 更新到gmfe@1.14以上版本解决发版时的registry切换问题 # 或者自己手动使用nrm来切换 # 查看 npm 版本 npm -v # 升级到6.9.0 npm i npm@6.9.0 -g
我们原先的做法是,将package-lock.json加入到.gitignore,但是并没有配置npmrc,这样所有机器npm i时仍然会生成一份package-lock.json。为了把package-lock.json提交到git,需要做一些工作。
.gitignore
npmrc
rm -rf node_modules package-lock.json && npm i
如果是重新生成package-lock.json,最好自己本地跑下(or 发布测试),避免某个包升级可能带来的问题(小概率),npm i后注意看下warning。
warning
提交后,其他人将代码拉下来,npm i就能得到一样的依赖。
确认自己的 npm 版本 和 registry 没问题。 使用package-lock.json后,npm install,npm update等一些命令会自动同步修改package-lock.json,所以如果要更新某个包,执行npm i xxx@x.y.z,提交代码的时候带上package-lock.json就行。
npm i xxx@x.y.z
多人协作的场景下,package.json和package-lock.json可能会产生冲突。先手动的解决掉package.json的冲突,然后执行npm install --package-lock-only让 npm 自动的解决lock文件的冲突。
npm install --package-lock-only
如果只是lock文件有冲突,可以通过安装 npm-merge-driver 解决,每次 git rebase 后会自动的调用 driver 来解决 lock 文件的冲突。
# 安装这个后 git 会自动的解决只有lock文件的冲突 npx npm-merge-driver install -g
package-lock.json 需要写进 .gitignore 吗? npm-package-locks
package-lock
package-lock.json
会记录整个依赖树的版本、目录结构、包下载的地址等,有以下几点好处。确定性
所有机器执行
npm install
都能得到确定的dependencies,保证了CI,多人协作的一致性。比如之前webpack@4.29的问题,因为本地开发环境和发布环境使用的
webpack
版本不同,在发布时出现webpack
构建报错,这个问题可以更早的在开发环境暴露出来。回溯
可以通过
git
还原某个版本的完整依赖关系,这在之前是做不到的。之前如果要回退到三个月前的某个版本,虽然还原了
package.json
,但是因为是语义化版本(^),某些包的minor release也可能带来break change
,npm install
npm start
后,整个项目可能根本运行不起来,不知道哪个包出了问题。方便diff
npm update
更新包后,提交时可以通过 diffpackage-lock.json
更直观的看到包版本的变化。安装速度
npm
可以根据 lock 跳过一些 metadata 的解析,提升安装速度。registry和npm版本
不同npm版本,执行
npm i
生成的lock格式略有差异(测试发现5.6,6.4,6.9三个版本都有不同的地方)。package-lock.json
中记录了包的下载地址,由registry
决定。 如果团队每个人使用的npm
版本和registry
都不相同的话,在没有更新包版本的情况下,lock 文件也会经常变化更新,可能会产生不必要的冲突。所以统一一下,使用 npm@6.9.0,淘宝源。
迁移步骤
我们原先的做法是,将
package-lock.json
加入到.gitignore
,但是并没有配置npmrc
,这样所有机器npm i
时仍然会生成一份package-lock.json
。为了把package-lock.json
提交到git,需要做一些工作。package-lock.json
中记录的也是淘宝源,而不是 npm(搜索 registry.npmjs.org)rm -rf node_modules package-lock.json && npm i
生成新的 package-lock.json如果是重新生成
package-lock.json
,最好自己本地跑下(or 发布测试),避免某个包升级可能带来的问题(小概率),npm i
后注意看下warning
。提交后,其他人将代码拉下来,
npm i
就能得到一样的依赖。后续开发
确认自己的 npm 版本 和 registry 没问题。 使用
package-lock.json
后,npm install
,npm update
等一些命令会自动同步修改package-lock.json
,所以如果要更新某个包,执行npm i xxx@x.y.z
,提交代码的时候带上package-lock.json
就行。冲突解决
多人协作的场景下,
package.json
和package-lock.json
可能会产生冲突。先手动的解决掉package.json
的冲突,然后执行npm install --package-lock-only
让 npm 自动的解决lock文件的冲突。如果只是lock文件有冲突,可以通过安装 npm-merge-driver 解决,每次 git rebase 后会自动的调用 driver 来解决 lock 文件的冲突。
参考
package-lock.json 需要写进 .gitignore 吗? npm-package-locks