11

我有这样的标准Lerna存储库:

my-repo
 - package.json
 - packages
   - api
     - package.json
   - web-app 
     - package.json

如果我在两个包中都需要相同的依赖项(例如lodash),那么教程中的人建议将它安装到两个子模块中,然后使用带有lerna bootstrap --hoist标志的引导项目。

由于--hoist标志lodash依赖项将仅加载到根级别node_modules,但两个子模块都将其作为依赖项包含在其适当的package.json

但是 Node 的包解析算法会在文件树上搜索文件node_modules夹。

所以我的问题是为什么我不能只将公共依赖项安装到根级项目?然后lodash将位于根目录下node_modules。并且子模块(包)会找到它,因为 Node 会向上搜索,node_module直到到达文件系统的根目录。

至少它会帮助我避免使用 uncommon lerna bootstrap --hoist,并且lodash依赖项只会在顶层出现一次package.json(而不是两次:在package.json两个子模块中)

4

2 回答 2

10

所以我的问题是为什么我不能只将公共依赖项安装到根级项目?

你可以,而且你是对的,节点的解析算法会发现共享依赖关系很好。这样做的缺点是您失去了灵活性,并且您需要部署或使用整个单一存储库,这可能对您来说很好。更传统的方法是将生产依赖项保留在子包中,以便您可以发布包并单独使用它们,而不依赖于 monorepo 的根目录,但同样,这对您来说可能并不重要。

于 2018-12-29T20:16:38.003 回答
1

如果您的包是您打算通过发布到某个 npm 注册表来重用的 npm 包,那么您应该为它们提供适当的 package.json 依赖项。

一个包应该总是列出它需要什么来操作。例如,如果您的“api”包在运行时需要 lodash,那么它的依赖项中必须有 lodash。否则应用程序可以在没有 lodash 的情况下安装它;那么它将无法运行。

在您的 lerna 存储库中,您的“根”package.json 未连接到任何 npm 包,也未发布,因此它不会影响您的“真实”npm 包:“api”和“web-app”。

最后,如果您不打算将您的包发布为 npm 包,那么您可以随心所欲。在这种情况下,Lerna 可能是矫枉过正。甚至 package.json 也太过分了,因为它只是被用于它的scripts.

于 2021-01-11T23:18:16.190 回答