Monorepo 中的依赖项

问题描述

在 monorepo 中,如果您在一个包中有依赖项,是否可以在另一个包中使用该依赖项而不将其添加到该包中?为了更清楚,请查看以下布局。

Project
   |-packages
       |- packageA
            |- package.json (Here let say I have lodash dependency)
            |- index.js
       |- packageB
            |-package.json (I haven't added lodash here.)
            |- index.js

那么,我可以在 packageB 的 index.js 中导入 lodash 还是必须在那里添加它?

解决方法

如果packageB使用lodash,你应该在package.json的{​​{1}}文件中列出lodash。如果你不这样做,坏事可能会发生。例如,考虑以下情况:

  1. lodash 从 packageB 中移除。在您的情况下,您提到 packageA 将 lodash 作为依赖项列出。但是,如果在此过程中您重构了 packageA 不再需要 lodash,您可能会认为它未使用而将其删除。如果 packageA 依赖于 packageB 安装 lodash,那么 packageA 将由于缺少依赖关系而中断。
  2. packageB 安装时没有 packageB。在不知道您的软件包包含什么的情况下,很难确定,但是现在或将来您(或其他人)有可能在不安装 packageA 的情况下安装 packageB。然后,您会遇到相同的情况,即未安装 lodash 并且 packageA 会中断。
  3. packageB 更新到 lodash 的新主要版本。如果 packageA 不再与 lodash 的新主要版本兼容,它可能会中断。如果 packageB 指定它自己对 lodash 的依赖,这不会成为问题,因为您可以根据最佳方式一起或单独更新它们。

其他情况也可能发生,这些只是几个例子。

注意,您可以packageBpackageA 中将 lodash 指定为对等依赖项,让消费应用程序安装 lodash,这样您就不必在两者中都安装它包,但这并没有真正简化您的 monorepo 或消费应用程序中的事情。

,

作为不同的包,你必须依赖两者。您可以对 monorepo 使用 Lerna 来匹配依赖项并分配为根依赖项。

lerna link convert