Monorepo中的对等依赖

时间:2019-09-20 11:05:44

标签: javascript npm yarnpkg lerna monorepo

当Monorepo中的程序包具有对等依赖关系时,在开发过程中应如何使这些依赖关系可用?

例如,位于/packages/namespace/alpha/的软件包在其devDependency中可能具有styled-components的{​​{1}}。

可能的选项:

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

  2. 在monorepo的路由package.json中安装软件包(使用package.json时模块解析的潜在问题。

我在纱线工作区中使用Lerna。

1 个答案:

答案 0 :(得分:8)

纱线工作区应该依靠node's module resolution algorithm将几乎所有内容安装在根node_modules中。这就是您在选项2中描述的内容。

因此,基本上,它在大多数情况下都应该起作用。当某些工具依赖于its own resolution logic或存在different versions依赖关系等等时,可能会出现问题。

选项1是一种很常见的方法,但是正如您所说的,它增加了维护成本。您可能需要跟踪此类依赖性并将它们标记为外部,以避免将它们包括在lib的内置版本中。

有可能的解决方法。例如,Angular suggests使用TS paths选项。在没有打字稿的情况下,例如在Create React App using jsconfig.json中,您也可以做同样的事情。 或者,您可以使用类似于此rollup plugin的方法来自动基于peerDependencies添加外部元素,因此也可以安全地将它们列为devDependies。

这两个选项在this lerna issue中都是合法的

另一种选择是安装您的对等依赖项,到目前为止,还没有“官方”解决方案。 install peers cli软件包可与npmyarn一起使用。 yarn有一个hot feature request。有计划将此功能添加到npm v7中,实际上npm在v3之前完成了该功能。

总结起来,没有一个万能的解决方案,您需要了解想要获得什么以及可以为此付出什么。

更新(2020年12月14日)— NPM 7将安装对等部门

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