package-locks 机制简述
问题
假设我们安装 eslint:
npm install --save-dev eslint
安装完后,在 package.json 里面生成如下模块版本:
{ "devDependencies": { "eslint": "^5.13.0" } }
然后你把 package.json 提交到代码库。过了一段时间,有新人加入到项目里面。他克隆出了代码,然后本地安装依赖包 npm install
。在他安装的时候 eslint 已经发布了新的版本5.16.0。那么新人本地安装的 eslint 版本就会变成5.16.0。这个机制意味着同一份 package.json 在不同时间安装出来的依赖包有可能不一样。可能造成的后果就是依赖不一致程序不 work(一种环境不一致导致的问题)。
解决方案
那么你说我把 package.json 里面的版本写死不就可以了吗?虽然这样,你项目的直接依赖版本固定了,但是你不能保证你安装的包自己也写死它的依赖,也就是说 eslint 模块依赖的包可能会随着时间升级。为了解决这个问题出现了 package-lock.json。当你 npm install 的时候,同时会生成一个 package-lock.json,这个文件记录了你运行 npm install 命令那一个时刻的模块依赖树(就是你安装的所有包的版本等信息)。当你把这个文件提交到代码库之后,其他人在其他时间克隆出代码再 npm install 的时候,npm 会看到有 package-lock.json 文件,那么就会按照其描述的依赖树安装包。也就是说通过这一个机制保证同一份 package.json 在不同时间安装出的包依赖树是一致的。
但是我要更新我依赖的包呢?当你使用 npm update 更新现有包,或者 npm install 安装新包后,如果改变了 package.json 那么 npm 同时会更新 package-lock.json。使 package.json 和 package-lock.json 保持某一时刻的一致。
历史
以上是现有 npm-v6.10.2 的机制,但是这个机制也是经过演化,一开始出来 package-lock.json 的时候,其行为并不完全按上面的机制运行,具体历史可以看这个贴子:https://www.zhihu.com/questio...