问题描述
在 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。如果你不这样做,坏事可能会发生。例如,考虑以下情况:
- lodash 从
packageB
中移除。在您的情况下,您提到packageA
将 lodash 作为依赖项列出。但是,如果在此过程中您重构了packageA
不再需要 lodash,您可能会认为它未使用而将其删除。如果packageA
依赖于packageB
安装 lodash,那么packageA
将由于缺少依赖关系而中断。 -
packageB
安装时没有packageB
。在不知道您的软件包包含什么的情况下,很难确定,但是现在或将来您(或其他人)有可能在不安装packageA
的情况下安装packageB
。然后,您会遇到相同的情况,即未安装 lodash 并且packageA
会中断。 -
packageB
更新到 lodash 的新主要版本。如果packageA
不再与 lodash 的新主要版本兼容,它可能会中断。如果packageB
指定它自己对 lodash 的依赖,这不会成为问题,因为您可以根据最佳方式一起或单独更新它们。
其他情况也可能发生,这些只是几个例子。
注意,您可以在 packageB
和 packageA
中将 lodash 指定为对等依赖项,让消费应用程序安装 lodash,这样您就不必在两者中都安装它包,但这并没有真正简化您的 monorepo 或消费应用程序中的事情。
作为不同的包,你必须依赖两者。您可以对 monorepo 使用 Lerna 来匹配依赖项并分配为根依赖项。
lerna link convert