Monorepo 中的依赖项

Dependencies in 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 还是我必须在那里添加它?

作为不同的软件包,您必须依赖两者。您可以使用 Lerna for monorepo 来匹配依赖项并指定为根依赖项。

lerna link convert

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

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

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

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