单体仓库和多个 node_modules 文件夹

Posted

技术标签:

【中文标题】单体仓库和多个 node_modules 文件夹【英文标题】:Monolithic repo and multiple node_modules folder 【发布时间】:2017-02-05 19:33:50 【问题描述】:

我有一个使用单体存储库的项目。每个包都有自己的 package.json 文件来管理所述包的依赖关系。我正在使用lerna 在我们的 monorepo 应用程序的所有“子包”中安装包。

目前的项目结构是这样的

项目/
|包.json
|节点模块/
|- 包/
|-- 包1/
|--- 包.json
|--- 节点模块/
|-- 包2/
|--- 包.json
|--- node_modules/

我正在寻找一种方法来概括根 node_modules 文件夹中的常见依赖项,以便每个包在运行 lerna exec -- npm install 时不会提取自己的节点包副本,而是使用位于根目录的那个整体存储库,因此我们避免在多个存储库中安装相同的包,从而减少项目的大小。

我已经看到了一些解决方案,包括在项目之间建立一些符号链接,但这似乎不是一门精确的科学,因为符号链接支持非常依赖于操作系统。此外,这似乎不是一种受支持的方式。

目前,我们才刚刚开始,在运行 lerna exec -- npm install 之后,该项目已经在磁盘上大约 350mb,第一次从 npm 提取所有内容大约需要 5 分钟。由于项目会随着时间的推移而增长,这个时间也会随着时间的推移而延长......

所以要恢复一切,我正在寻找一种方法来提取 repo 根目录下的 node_modules 文件夹中的公共依赖项,并使子包从该文件夹中提取它们的公共依赖项,而不是每次都获取自己的副本.

【问题讨论】:

【参考方案1】:

Lerna 最近添加了一个--hoist 选项,看起来它提供了您在此处寻找的内容。它在 repo 根目录安装外部依赖项,因此它们可用于所有包。二进制文件链接到依赖包 node_modules/.bin/ 目录,因此它们可用于 npm 脚本。

它可以在命令行中传递或添加到lerna.json 以进行持久配置。

文档可在此处获得:https://github.com/lerna/lerna#--hoist-glob

【讨论】:

不错。感谢您指出。我一定会很快看看这个。我还看到他们添加了一个标志来切换到纱线。挺好看的。 这很好用并且解决了这个问题。正如@Bo 评论的那样,您可以将其放在lerna.json 中作为"hoist": "**" 只是一个快速更新。我们最近改用纱线并将时间缩短了一半。唯一的问题是您必须使用 --concurrency=1 参数调用 lerna ,但是无论我们从默认值 4 下降到 1 个并发运行,这仍然将时间减半。仍然没有尝试 hoist 参数,到老实说,我忘记了。如果我们尝试过,我会发布和更新。【参考方案2】:

截至 2017 年 8 月,Yarn 包含一个名为 Workspaces 的功能,它正是这样做的。但更棒的是,可以通过--use-workspaces让Lerna知道并与之集成。像往常一样运行lerna bootstrap 将自动处理所有这些。

【讨论】:

我完全错过了那个,因此我正在关注有关 yarn 和 lerna 的新闻。我一定会试一试的!谢谢指出!【参考方案3】:

我建议完全不要使用lerna。我认为这是一个错误的想法。

相反,只需将单独的模块放在它们自己的文件中并使用 import mod1 from './mod' 等加载,或者继续创建单独的 repos。但是不要为每个小模块创建单独的 repos —— 只是你或其他人绝对可以重复使用的东西(即你想发布它来帮助其他人)。

您可以利用npm link,作用域包,在 package.json 中列出 github 存储库和 dependencies:"mod1":"myorg/mod1",以便更容易将其放在单独的存储库中(必要时)。

特别是npm link 应该简化事情。 http://justjs.com/posts/npm-link-developing-your-own-npm-modules-without-tears

【讨论】:

感谢您的回答。昨天yarn 出来了,看起来很有趣,可以解决我在那里遇到的大部分问题。我会看看它,然后回来告诉你和人们知道它是否能解决我们的大部分问题。

以上是关于单体仓库和多个 node_modules 文件夹的主要内容,如果未能解决你的问题,请参考以下文章

将 node_modules 目录放入 Git 仓库的优点

单个node_modules文件夹,用于多个项目

node_modules 在任何项目文件夹之外的多个目录中

Java单体应用 - 架构模式 - 03.设计模式-04.建造者模式

如何让 VS Code 智能感知在多个 node_modules 文件夹中搜索打字稿

Java单体应用 - 架构模式 - 04.实践练习