yarn dedupe
删除具有重叠范围的重复依赖项
语法
- yarn dedupe ...
实例
删除所有包:
- yarn dedupe
删除特定包的重复数据:
- yarn dedupe lodash
使用特定策略对所有包进行重复数据删除:
- yarn dedupe --strategy highest
对范围内的所有包进行重复数据删除@babel/*
:
- yarn dedupe '@babel/*'
检查重复项(可用作 CI 步骤):
- yarn dedupe --check
选项
- -s,--strategy #0
- 删除依赖项时使用的策略
- -c,--check
- 找到重复项时以退出代码 1 退出,而不保留依赖树
- --json
- 输出格式化为 NDJSON 流
- --mode #0
- 更改安装生成的工件
细节
重复项被定义为具有重叠范围的描述符被解析并锁定到不同的定位器。它们是 Yarn 的确定性安装的自然结果,但它们有时会堆积起来并不必要地增加项目的大小。
该命令使用不同的策略对当前项目中的依赖项进行重复数据删除(目前只实现了一种):
highest
:重复使用(在可能的情况下)具有最高版本的定位器。这意味着依赖项只能升级,不能降级。它还可以保证对整个依赖树进行重复数据删除的次数永远不会超过一次。
注意:尽管它永远不会产生错误的依赖树,但应谨慎使用此命令,因为它会修改依赖树,当包不严格遵循 semver 建议时,这有时会导致问题。因此,建议也手动查看更改。
如果设置,该 -c,--check
标志将只报告找到的重复项,而不保留修改后的依赖树。如果发现更改,该命令将以非零退出代码退出,使其适用于 CI 目的。
如果 --mode=<mode>
设置了该选项,Yarn 将更改生成的工件。目前支持的模式有:
-
skip-build
根本不会运行构建脚本。请注意,这与设置为 false 不同enableScripts
,因为后者将禁用构建脚本,从而影响磁盘上生成的工件的内容,而前者只会禁用构建步骤 - 但不会禁用脚本本身,这不会跑步。 -
update-lockfile
将完全跳过链接步骤,只获取锁定文件中缺少的包(或没有相关校验和的包)。此模式通常由 Renovate 或 Dependabot 等工具使用,以使锁定文件保持最新,而不会产生全部安装成本。
此命令接受 glob 模式作为参数(如果有效的 IDents 并受 micromatch支持)。确保对模式进行转义,以防止您自己的 shell 尝试扩展它们。
深入解释:
默认情况下,Yarn 不会对依赖项进行重复数据删除,否则安装将不确定并且锁定文件将无用。它实际上所做的是,它首先尝试不重复依赖项。
示例:如果 foo@^2.3.4
(一个依赖的依赖)已经被解析为 foo@2.3.4
,运行 yarn add foo@*
将导致 Yarn 重用 foo@2.3.4
,即使最新的foo实际上是foo@2.10.14
,从而防止不必要的重复。
当 Yarn 无法解锁已经锁定在锁定文件中的依赖项时,就会发生重复。
示例:如果 foo@^2.3.4
(a dependency of a dependency) 已经解析为 foo@2.3.4
,运行 yarn add foo@2.10.14
将导致安装 Yarn foo@2.10.14
,因为现有解析不满足范围 2.10.14
。这种行为可能会导致(有时)不需要的重复,因为现在锁定文件包含 2 个foo
描述符的 2 个独立解析,即使它们具有重叠的范围,这意味着可以简化锁定文件,以便两个描述符都解析为 foo@2.10.14
.