Skip to content

Latest commit

 

History

History
67 lines (41 loc) · 4.21 KB

package-lock-and-yarn-lock.md

File metadata and controls

67 lines (41 loc) · 4.21 KB

package-lock.json 与 yarn.lock

欢迎您帮忙纠错, 一起帮助更多的人。 一起来学习交流 React, QQ 群:413381701

package-lock.json 是什么?

npm 5.0 版本以后,package-lock.json 是在 npm install 时候生成一份文件,用以记录当前状态下实际安装的各个 npm package 的具体来源和版本号。

比如:

"dependencies": {
  "redux": "^3.0.0"
}

这里面的 向上标号 ^语义化版本)是定义了向后兼容依赖,指如果 redux 的版本是超过 3.0.0,并在大版本号(3)上相同,就允许下载最新版本的 redux 库包,例如实际上可能运行 npm install 时候下载的具体版本是 3.0.1 或直到 3.9999.9999。

大多数情况这种向后兼容依赖下载最新库包的时候都没有问题,可是因为 npm 是开源世界,各库包的版本语义可能并不相同,有的库包开发者并不遵守严格这一原则:相同大版本号的同一个库包,其接口符合兼容要求。这时候用户就很头疼了:在完全相同的一个 nodejs 的代码库,在不同时间或者不同 npm 下载源之下,下到的各依赖库包版本可能有所不同,因此其依赖库包行为特征也不同有时候甚至完全不兼容。

因此 npm 最新的版本就开始提供自动生成 package-lock.json 功能,为的是让开发者知道只要你保存了源文件,到一个新的机器上、或者新的下载源,只要按照这个 package-lock.json 所标示的具体版本下载依赖库包,就能确保所有库包与你上次安装的完全一样。

那我 npm 老版本(低于 5.0 的环境)也想要这种自行车怎么办? 其实很简单,只要在 package.json 的时候手动「锁定」版本,去掉向上标号 ^,如:

"dependencies": {
  "redux": "3.0.0"
}

-----------手动滑稽分隔线-----------

你以为 package-lock.json 真的这么简单? 那你错了

自 npm 5.0 版本发布以来,npm install 的规则发生了三次变化。

1、npm 5.0.x 版本,不管 package.json 怎么变,npm install 时都会根据 lock 文件下载 package-lock.json file not updated after package.json file is changed · Issue #16866 · npm/npm

这个 issue 控诉了这个问题,明明手动改了 package.json,为啥不给我升级包!然后就导致了 5.1.0 的问题...

2、5.1.0 版本后 npm install 会无视 lock 文件 去下载最新的 npm 然后有人提了这个 issue why is package-lock being ignored? · Issue #17979 · npm/npm

控诉这个问题,最后演变成 5.4.2 版本后的规则。

3、5.4.2 版本后,如果改了 package.json,且 package.json 和 lock 文件不同,那么执行 npm install 时 npm 会根据 package 中的版本号以及语义含义去下载最新的包,并更新至 package-lock.json。

如果两者是同一状态,那么执行 npm install 都会根据 package-lock.json 下载,不会理会 package 实际包的版本(作者)是否有新的发布。

最后:建议大家把 npm 升级至 5.4.2 及以上版本, 命令行执行:npm install -g npm

yarn.lock 是什么?

为了跨机器安装得到一致的结果,yarn 采用一个 yarn.lock 文件来应对这个问题(同 package-lock.json,npm 借鉴了 yarn)。yarn.lock 会记录你安装的所有软件包的具体版本号。只要你不删除 yarn.lock 文件,再次运行 yarn install 时,会根据其中记录的版本号获取所有依赖包,这就特别适合大型项目的多人协作开发和部署。

该不该把 lock 文件添加版本控制系统(划重点)

  • 如果你的项目组所有同事都使用 npm 5.4.2 以上版本package-lock.json 应该被提交到版本控制系统
  • 如果你的项目组使用 yarn,yarn.lock 应该被提交到版本控制系统
  • 如果你的项目组有人用 npm,又有人用 yarn,那就尽早统一 :)

参考文档: