javascript - Monorepo 中的对等依赖关系

标签 javascript npm yarnpkg lerna monorepo

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

例如 /packages/namespace/alpha/ 的包裹可能有 devDependencystyled-components在其package.json .

可能的选项:

  • 声明与开发依赖项相同的依赖项(不必要的复制和维护成本)。
  • 在 monorepo 的路径中安装软件包 package.json (使用 yarn link 时模块分辨率的潜在问题。

  • 我将 Lerna 与 yarn 工作区一起使用。

    最佳答案

    Yarn 工作区应该在根目录 node_modules 中安装几乎所有东西依靠node's module resolution algorithm .这就是您在选项 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 clinpm 一起使用的软件包和 yarn .有一个hot feature request对于 yarn .计划将此功能添加到 npm v7 ,实际上 npm 在 v3 之前就已经做到了。
    总结一下,没有一种万能的解决方案,您需要了解自己想要得到什么以及可以为此牺牲什么。
    更新(2020 年 12 月 14 日)— NPM 7 安装对等部门
    正如我在最初的答案中提到的,npm v7 默认实现了安装对等依赖项。请引用RFC了解更多详情。

    关于javascript - Monorepo 中的对等依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58027193/

    相关文章:

    angular - 安装 ng 添加 @ng-bootstrap/ng-bootstrap 时出错

    javascript - 在页面提交之前直接执行 javascript 代码

    javascript - 无法使用 JQuery 触发的 PHP 写入 MySQL-DB

    npm - 在 SailsJS 中管理依赖关系

    node.js - Node bcrypt 安装出现问题

    javascript - 元素类型无效 : expected a string (for built-in components) or a class/function (for composite components) but got: object. React-Native

    node.js - 如何使用 YARN 或 npm 查找全局安装的包

    node.js - lerna 导入总是返回 EDESTDIR

    javascript - Angular ng-change 不适用于指令的模板

    javascript - Bootstrap 弹出链接不起作用