Monorepo 中的对等依赖关系

Und*_*ion 15 javascript npm lerna monorepo yarnpkg

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

例如,一个包在/packages/namespace/alpha/可能有一个devDependencystyled-components在它的package.json

可能的选项:

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

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

我正在将 Lerna 与纱线工作区一起使用。

Shl*_*ang 11

Yarn 工作区应该node_modules根据节点的模块解析算法将几乎所有内容安装在根目录中。这就是您在选项 2 中描述的内容。

所以,基本上它应该在大多数情况下工作。当某些工具依赖于自己的解析逻辑或某些依赖项存在不同版本等时,可能会出现问题。

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

有可能的解决方法。例如,Angular 建议使用 TSpaths选项。你可以在没有打字稿的情况下做同样的事情,例如,使用 jsconfig.json创建 React App 。或者你可以使用类似于这个rollup 插件的东西,它可以自动添加基于 的外部peerDependencies变量,这样你也可以安全地将它们列为 devDependies。

这个 lerna 问题中两个选项都被认为是合法的

另一种选择是安装您的对等依赖项,就目前而言,没有“官方”解决方案。有与和一起使用的安装 peers cli包。有一个热功能要求的。有计划将此功能添加到npm v7,实际上 npm 在 v3 之前就已经做到了。npmyarnyarn

总结一下,没有一刀切的解决方案,您需要了解自己想要得到什么以及可以为此牺牲什么。

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

正如我在初始答案中提到的,npm v7 默认实现了安装对等依赖项。有关详细信息,请参阅RFC