在实际项目中我们如果想正确使用 yarn.lock
, 有必要了解什么是锁定文件以及它是如何工作的。尽管根据您使用的是 npm 还是 yarn 可以有不同的名称,但前提几乎相同。笔者从事 SAP Spartacus 开发中使用的是 yarn,所以我将在本文中使用 yarn.lock 作为示例。
当您在项目中运行 yarn 时,可能会发生两件事:
- 根据 package.json 的内容生成一个锁文件(yarn.lock)(如果没有的话)
- 根据现有 yarn.lock 的内容安装包
重要提示:当您在应用程序或库中安装依赖项时,只考虑顶级 yarn.lock 文件。依赖项中的锁定文件将被忽略。
简而言之:
当存在于项目中时,yarn.lock 是有关项目中依赖项当前版本的主要信息来源。 Yarn 使用该信息来检查它是否需要更新任何东西——它将当前安装在项目中的依赖版本(列在 yarn.lock 中)与 package.json 中的版本限制进行比较,并在需要时更新包。其他用户可以进一步使用来自锁定文件的信息在别处创建可重复
的环境。
每当您在全新安装时运行 yarn(相当于运行 yarn install)时,都会生成一个 yarn.lock 文件。 它列出了在安装过程中使用的依赖项的版本。 这意味着它会查看您的 package.json 并根据版本控制语法,它将安装您的项目依赖项,然后是它们的依赖项,然后是它们的依赖项,等等。
假设您的项目使用两个依赖项:chicken 和 farm. 这两个都是外部包,我们无法控制:
package.json:
// package.json (your project)
dependencies: {
"chicken": "^1.2.0",
"farm": "https://files.jxasp.com/image/2.3.0"
}
并且 farm 包本身使用特定版本的 chicken,见下面 farm 包的 package.json:
// package.json (`farm` package)
dependencies: {
"chicken": "1.0.0",
(...)
}
- farm 包所依赖的 1.0.0
^1.2.0
在项目的 package.json 中定义。 这将在全新安装时有所不同,具体取决于 1.2.0 之后的最新版本 -^
符号允许更改不修改版本号中最左侧的非零元素。
这将导致我们的项目需要两个版本的 chicken:
对于这个特定的版本范围,它意味着:
1.2.0 <= 安装版本 < 2.0.0
。 举个例子 - 如果 v1.2.4 在您的项目(新)安装时可用,它将被安装。 v1.5.8、v1.7.2、v1.9.9 相同,但 v2.0.0 不一样。
安装后,会导致如下的项目层级结构: