Monorepo 中的对等依赖关系
Posted
技术标签:
【中文标题】Monorepo 中的对等依赖关系【英文标题】:Peer Dependencies In A Monorepo 【发布时间】:2020-01-21 10:38:12 【问题描述】:当 monorepo 中的包具有对等依赖项时,应如何在开发过程中提供这些依赖项?
例如,/packages/namespace/alpha/
的包可能在其package.json
中包含styled-components
的devDependency
。
可能的选择:
声明与开发依赖项相同的依赖项(不必要的复制和维护成本)。
在 monorepo 的路由 package.json
中安装软件包(使用 yarn link
时模块解析的潜在问题。
我将 Lerna 与纱线工作区一起使用。
【问题讨论】:
【参考方案1】:Yarn 工作区应该安装几乎所有依赖于node's module resolution algorithm 的根目录node_modules
。这就是您在选项 2 中描述的内容。
所以,基本上它应该在大多数情况下都可以工作。当某些工具依赖于its own resolution logic或存在某些依赖的different versions等时,可能会出现问题。
选项 1 是一种非常常见的方法,但正如您所说,它增加了维护成本。您可能需要跟踪此类依赖项并将它们标记为外部,以避免将它们包含在 lib 的构建版本中。
有可能的解决方法。例如,Angular suggests 使用 TS paths
选项。你可以在没有 typescript 的情况下做同样的事情,例如 Create React App using jsconfig.json。
或者您可以使用类似于 rollup plugin 的东西,它会根据 peerDependencies
自动添加外部,因此您也可以安全地将它们列为 devDependies。
这两个选项在this lerna issue 中都被认为是合法的
另一种选择是安装您的对等依赖项,就目前而言,没有“官方”解决方案。有install peers cli 包可与npm
和yarn
一起使用。 yarn
有一个 hot feature request。有计划在npm v7上添加这个功能,实际上npm在v3之前就已经做到了。
总结一下,没有万能的解决方案,您需要了解自己想要得到什么以及可以为此牺牲什么。
更新(2020 年 12 月 14 日)- NPM 7 安装 peer deps
正如我在最初的回答中提到的,npm v7 默认实现了安装对等依赖项。详情请参考RFC。
【讨论】:
以上是关于Monorepo 中的对等依赖关系的主要内容,如果未能解决你的问题,请参考以下文章