本文作者: jsweibo
本文链接: https://jsweibo.github.io/2019/04/24/%E4%BB%80%E4%B9%88%E6%98%AFpackage-lock-json/
摘要
本文主要讲述了:
- 背景
- 作用
- 弊端
正文
考虑这样一种场景:
开发者创建了一个名为example的包,并添加了名为a的依赖。
在开发者创建example包的时候,a的版本是1.0.0,所以npm install下载了1.0.0版本的a,并在a的版本号前添加一个^,将此版本范围信息写入package.json。
1 | { |
a这个依赖的版本范围如下表所示:
| Package Name | Version Range |
|---|---|
| a | >=1.0.0 <2.0.0 |
过了一段时间,开发者在另外一台电脑上继续开发这个项目时,a的作者已经更新了1.1.0的包,1.1.0符合>=1.0.0 || <2.0.0这个范围,所以 npm 下载了1.1.0版本的包。
此时,两台电脑上的包的依赖就有了区别。
为了避免这种问题,npm 创建了package-lock.json来锁定依赖包的版本号。
作用
锁定依赖包的版本号,方便开发者复原开发环境。
注意:package-lock.json只是为了复原开发环境使用,当执行npm publish发布包时,不能发布package-lock.json,因为锁定版本会造成依赖冗余。
弊端
再考虑一种场景:
若在example@1.0.0的开发过程中,a一直都没有更新,直到example@1.0.0上线后,a突然发布a@1.1.0版本,且a的开发者并未遵循语义化版本原则,在a@1.1.0中引入了不向后兼容的新功能或取消了a@1.0.0中已存在的功能。
对于example@1.0.0的用户来说,由于package-lock.json不能被发布,因此线上版的依赖版本无法被锁定,用户在安装example@1.0.0的时候实际下载了a@1.1.0,因此用户将无法使用example@1.0.0。
对于example@1.0.0的开发者来说,由于package-lock.json的存在,a的版本被锁定在了a@1.0.0,因此将很难排查出此问题。
参考资料
本文作者: jsweibo
本文链接: https://jsweibo.github.io/2019/04/24/%E4%BB%80%E4%B9%88%E6%98%AFpackage-lock-json/
本文对你有帮助?请支持我
- 本文链接: https://jsweibo.github.io/2019/04/24/%E4%BB%80%E4%B9%88%E6%98%AFpackage-lock-json/
- 版权声明: 除非另有说明,否则本网站上的内容根据署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。