Monorepo 中的对等依赖

Peer Dependencies In A Monorepo

当 monorepo 中的包具有对等依赖项时,在开发过程中应如何使这些依赖项对它们可用?

例如,位于 /packages/namespace/alpha/ 的包裹在其 package.json 中可能有 devDependencystyled-components

可能的选项:

  1. 也声明与开发依赖相同的依赖(不必要的重复和维护成本)。

  2. 在 monorepo 的路径 package.json 中安装包(使用 yarn link.

  3. 时模块解析的潜在问题

我在 yarn 工作区中使用 Lerna。

Yarn 工作区应该安装几乎所有依赖于 node's module resolution algorithm 的根目录 node_modules。这就是您在选项 2 中描述的内容。

所以,基本上它应该在大多数情况下都有效。当某些工具依赖于某些依赖项的 its own resolution logic or there are different versions 等时,可能会出现此问题。

选项 1 是一种很常见的方法,但正如您所说,它会增加维护成本。您可能需要跟踪此类依赖项并将它们标记为外部,以避免将它们包含到库的构建版本中。

有可能的解决方法。例如,Angular suggests using TS paths option. And you can do pretty the same without typescript in, for example, Create React App using jsconfig.json。 或者您可以使用类似于此 rollup plugin 的东西,它会根据 peerDependencies 自动添加外部组件,因此您也可以安全地将它们列为 devDependies。

这两个选项在 this lerna issue

中都被认为是合法的

另一种选择是安装对等依赖项,目前还没有“官方”解决方案。有install peers cli package that works with npm and yarn. There is a hot feature request for yarn. There is a plan to add this feature to npm v7,其实npm在v3之前就做了

总结一下,没有放之四海而皆准的解决方案,您需要了解自己想要得到什么以及可以为此牺牲什么。

更新(2020 年 12 月 14 日)— NPM 7 安装 peer deps

正如我在最初的回答中提到的,npm v7 默认实现了安装对等依赖项。详情请参考RFC