一个 Monorepo 中的同行依赖

27

当一个 monorepo 中的包存在对等依赖项时,应该如何在开发过程中向这些依赖项提供支持?

例如,在 /packages/namespace/alpha/ 处的一个包可能在其 package.json 中有一个 styled-componentsdevDependency

可能的选项:

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

  2. 在 monorepo 的根目录下的 package.json 中安装包(使用 yarn link 时可能会出现模块解析问题)。

我正在使用 Lerna 和 yarn workspaces。

1个回答

13
Yarn工作区应该将几乎所有内容安装在根目录的node_modules中,依靠Node的模块解析算法。这就是你在选项2中描述的方式。
因此,基本上它应该在大多数情况下工作。问题可能会发生在某些工具依赖于自己的解析逻辑或某些依赖项存在不同版本等情况。
选项1是一种常见方法,但正如你所说,它增加了维护成本。您可能需要跟踪此类依赖项并将其标记为外部依赖项,以避免将它们包含在构建版本的库中。
有可能的解决方法。例如,Angular建议使用TS paths选项。您也可以在没有TypeScript的情况下做类似的事情,例如,在Create React App中,使用jsconfig.json。或者您可以使用类似于Rollup插件的东西,该插件根据peerDependencies自动添加外部依赖项,因此您也可以将它们安全地列为devDependies。

这两个选项在此Lerna问题中都被认为是合法的。

另一种选择是安装对等依赖项,目前还没有“官方”解决方案。有一个与npmyarn一起工作的安装同级cli包。对于yarn,有热门功能请求。计划向npm v7添加此功能,实际上,npm在v3之前就已经这样做了。

总之,没有一种适合所有情况的解决方案,您需要了解您想要什么以及为此您可以牺牲些什么。

更新(2020年12月14日)- NPM 7安装对等依赖项

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接