TLDR:
当你在你的
应用程序,仅尊重您自己的 yarn.lock 文件。锁定文件
在您的依赖项中将被忽略。 Reference
让我们先把一些事情弄清楚:
-
--pure-lockfile 与正常的 yarn 安装相同,只是它不会生成 yarn.lock 文件或更新一个(如果存在)。
- 默认情况下,Yarn 总是从
yarn.lock 读取以在安装时解决依赖关系,除非提供 --no-lockfile。因此,没有必要告诉它从yarn.lock 读取。
yarn.lock 是做什么用的?
yarn.lock 用于解析应该获取的version
给定package.json 中模块的semver version。它不用于确定应将模块解析为什么semver version。那根本不是它的use-case。
如 yarn DOCS 中所述:为了保持一致
跨机器安装,Yarn 需要的信息比
您在包 json 中配置的依赖项。纱线需要 store
确切地安装了每个依赖项的哪些版本。
为此,Yarn 使用项目根目录中的 yarn.lock 文件。
因此,为了解决依赖关系的semver version,yarn 始终依赖于package.json。对于给定的semver version,yarn 检查yarn.lock 文件以查看它应该获取什么version。这就是纱线 Deterministic 的原因(npm 使用相同的技术,它使用 npm-shrinkwrap.json)。
示例:像^1.2.4 这样的Semver 版本可以解析为>= 1.2.3 and < 2.0.0 的任何版本号。如果没有 yarn,npm 将在一台机器上安装 1.2.4,但在另一台机器上安装 1.9.9,这取决于安装时存在的 最新 版本。这是yarn使用yarn.lock解决的问题。
semver version 由
package.json 文件。 yarn.lock 文件只是一个查找
version 和 commit hash 为给定的semver version 号码安装。
根据模块的 semver 版本,纱线如何解析模块的版本?
假设当前我们的 yarn.lock 文件如下所示:
bluebird@2.9.6:
version "2.9.6"
resolved "https://<...>/bluebird-2.9.6.tgz#1fc3a6b1685267dc121b5ec89b32ce069d81ab7d"
bluebird@^2.9.30:
version "2.11.0"
resolved "https://<...>/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1"
...
myModule@5.1.0:
version "5.1.0"
resolved "https://<...>/moduleA-5.1.0.tgz#ce97130858add59d616ee80675383b0c127290a0"
dependencies:
bluebird "^1.0.0"
- 如果 package.json 有
bluebird: "^2.9.30",yarn 会在锁文件中查找 bluebird@^2.9.30 条目。它存在,因此被解析为version=2.11.0。
- 如果 package.json 有
bluebird: "^2.9.0",yarn 会在锁文件中查找bluebird@^2.9.0 条目。它不存在。假设满足 semver 标准的最新稳定版本是2.13.0,那么 yarn 为bluebird@^2.9.0 添加一个条目,解析为2.13.0。在解析给定蓝鸟 semver version 的版本时,锁定文件中模块 A 的依赖项中的蓝鸟条目并不重要。
Semver Version不受条目的影响
存在于 yarn.lock 文件中的模块的依赖关系图中。
所以,如果 package.json 有 bluebird: "",yarn 会在 lockfile 中查找条目 bluebird@,但无法找到它。因此,它将bluebird: "" 解析为最新版本,假设3.5.0。现在,yarn 将为bluebird@ 添加一个条目,解析为3.5.0。
bluebird@:
version "3.5.0"
resolved "https://<...>/bluebird-3.5.0.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
当 yarn 遇到 {bluebird: ""} 时,Form 现在会在锁定文件中找到 bluebird@ 的条目,因此将始终将其解析为 3.5.0。
您的问题的解决方案
要将B: "" 解析为版本1.0.0,您需要将yarn.lock 中的B@ 条目解析为1.0.0。曾经,yarn.lock 有一个 B@ 的条目,所有后续安装将始终为 B="" 获取版本 1.0.0。
您需要采取以下步骤来完成相同的操作:
方法 1(推荐)
如果你想让 B 解析到最新版本:
- 在A的package.json中添加
B:""
- 运行
yarn install。这将为 B@ 添加一个条目,解析为最新版本。
- 推送
yarn.lock文件。
- 现在打开表单,运行
yarn install 的人将获得相同的版本。
方法 2
如果您希望 B 拥有旧版本:(强烈不推荐)
- 在A的package.json中添加
B: 1.0.0。
- 运行
yarn install。这将在锁定文件中添加一个条目B@1.0.0。
- 在 yarn.lock 中添加
B@ 和 B@1.0.0。 B@, B@1.0.0: ...
- 在 A 的 package.json 中将 B 的版本更改为
""。
- 推送
yarn.lock 文件。
- 现在打开表格,运行
yarn install 的人将获得B 的版本为1.0.0。
这种方法非常危险,因为您很容易破坏某些东西。您的 yarn.lock 文件应始终为 managed by yarn。
方法 3(推荐)
如果你想让 B 保持在 1.0.0
- 在 A 的 package.json 中将 B 的版本修复为
1.0.0。
- 运行
yarn install。这将在锁定文件中添加一个条目B@1.0.0。
- 推送 yarn.lock 文件
- 现在打开表格,运行
yarn install 的人将获得B 的版本为1.0.0。
编辑:使用依赖项中的 yarn.lock 文件
如果你查看doc:,他们已经明确提到,yarn 将仅使用顶级 yarn.lock 文件并忽略依赖项中存在的锁定文件。
目前无法使用其中存在的 yarn.lock 锁定二级依赖项。我认为没有必要。事实上,纱线的创造者解释了here为什么会这样。原因是:
- 二级依赖安装的版本可以是
正如我所解释的,由顶级 yarn.lock 文件很好地捕获
以上。
-
如果直接使用子依赖项,您将永远无法在在您自己的应用程序中更新它们的版本,因为它们会被其他 yarn.lock 文件锁定。您可以验证这一点通过我对纱线如何解决依赖关系的解释。
- Yarn 永远无法折叠(消除重复)依赖项,因此兼容的版本范围只能安装一个版本。
此外,在您的用例中,如果 A 具有仅适用于版本 1.0.0 的依赖项 B,则 A 的 package.json 应该将 B 的版本提到为 1.0.0 而不是“”。您始终可以修复您的顶级yarn.lock 以添加解析为1.0.0 的B@ 条目,但不建议手动修复yarn.lock 文件,如上所述。
希望这有帮助!如有任何疑问,请在 cmets 中联系我。