Yarn 2 Constraints 功能是否可以阻止软件包的安装?

Can the Yarn 2 Constraints feature block the installation of a package?

我有一个很深的依赖树。有些包依赖于我不需要的 nodejs 包。 Yarn 2 (berry) 是否可以跳过这些包,即不安装它们?

Yarn 有一个 Constraints 功能,但我不知道它有什么可能。有例子,但不是完全忽略包。

这可能吗?谢谢

约束允许您对项目(和工作区)的依赖性执行规则。它是一种编写规则的工具,适用于各种 package.json 文件中的内容,例如“每个工作区必须具有相同版本的 React”或“任何工作区都不能依赖于包 X”。

如果您有一个依赖项依赖于您认为确实是可选依赖项的内容,则可以使用 .yarnrc 将该依赖项更改为可选依赖项。使用 yarn why <foo> 找到导致不必要的深度依赖的包,然后将类似这样的内容添加到 .yarnrc(具体示例来自 here):

# Make `eslint-plugin-flowtype`'s peerDependency on `@babel/plugin-syntax-flow` optional.
# Use `dependenciesMeta` for non-peer deps, of course ;).
packageExtensions:
  'eslint-plugin-flowtype@*':
    peerDependenciesMeta:
      '@babel/plugin-syntax-flow':
        optional: true

请注意,这样做通常是相当冒险的:如果您认为一个包所依赖的东西实际上应该是可选依赖项,那么您可能应该向上游提交错误。

最后,请注意,这很可能是一个 non-problem:webpack(或我写这篇文章一周后流行的任何捆绑器)可能正在删除 compile-time 处不需要的文件反正?如果您发现仅仅是您不喜欢的节点包的存在导致了问题(例如,通过打字稿打字?)那么这是一个不同的问题,应该以不同的方式解决。