当Monorepo中的程序包具有对等依赖关系时,在开发过程中应如何使这些依赖关系可用?
例如,位于/packages/namespace/alpha/
的软件包在其devDependency
中可能具有styled-components
的{{1}}。
可能的选项:
还声明与开发人员依赖项相同的依赖项(不必要的复制和维护成本)。
在monorepo的路由package.json
中安装软件包(使用package.json
时模块解析的潜在问题。
我在纱线工作区中使用Lerna。
答案 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软件包可与npm
和yarn
一起使用。 yarn
有一个hot feature request。有计划将此功能添加到npm v7中,实际上npm在v3之前完成了该功能。
总结起来,没有一个万能的解决方案,您需要了解想要获得什么以及可以为此付出什么。
更新(2020年12月14日)— NPM 7将安装对等部门
正如我在初始答案中提到的那样,npm v7默认实现了安装对等项依赖关系。有关更多详细信息,请参阅RFC。