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/question/62331583/answer/275248129

参考文献

  1. 官方文档
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 什么是 NPM npm之于Node,就像pip之于Python,gem之于Ruby,composer之于PHP。 ...
    ihoey阅读 6,264评论 2 36
  • 本文是一篇英文blog翻译,原文"A Beginener's Guide to npm - the Node Pa...
    chr1s_gong阅读 1,122评论 0 1
  • 常用命令 通过 npm 安装 执行 set PATH=%PATH%;C:\.yarn\bin 来重新设置环境。 初...
    majun00阅读 1,739评论 0 3
  • 1.需求由来 之前,在react项目开发过程中遇到一个问题,同一个项目第一次cnpm install的时候还可以启...
    YINdevelop阅读 29,350评论 1 26
  • 都让开,我跟你讲!! 作为多年被春晚黑出天际的胡建人,大学第一志愿填写了东北。 当初因为觉得自己胆子小,太文静(表...
    占大美阅读 2,678评论 0 2