单体库和多个node_modules文件夹

8
我有一个使用单体仓库的项目。每个包都有自己的package.json文件来管理该包的依赖关系。我正在使用lerna在我们的monorepo应用程序的所有“子包”中安装包。
当前项目结构如下:
Project/ | package.json | node_modules/ |- packages/ |-- package1/ |--- package.json |--- node_modules/ |-- package2/ |--- package.json |--- node_modules/
我正在寻找一种方法将公共依赖项泛化到根node_modules文件夹中,以便每个包在运行lerna exec -- npm install时不会拉取自己的node包的副本,而是使用位于单体repo根目录中的那个,从而避免在多个repo中安装相同的软件包,从而减小项目的大小。
我看到了一些解决方案,其中包括在项目之间创建符号链接,但这似乎不是一种确切的科学,因为符号链接支持非常基于操作系统。此外,这似乎不是官方支持的方法。
目前,我们刚刚开始,在运行lerna exec -- npm install后,项目在磁盘上的大小已经达到了大约350MB,并且从npm拉取所有内容需要大约5分钟。随着时间的推移,随着项目的增长,这个时间也将逐渐延长...
因此,总结一切,我正在寻找一种方法,将公共依赖项提取到单体repo根目录中的node_modules文件夹中,并使子程序包从该文件夹中拉取其公共依赖项,而不是每次获取自己的拷贝。
3个回答

8
Lerna最近添加了一个--hoist选项,看起来正是你在这里寻找的。它将外部依赖项安装在仓库根目录,以便所有软件包都可以使用。二进制文件链接到依赖软件包的node_modules/.bin/目录,以便npm脚本可以使用。
它可以通过命令行传递或添加到lerna.json中进行持久化配置。
文档可在此处查看:https://github.com/lerna/lerna#--hoist-glob

不错。谢谢指出。我会尽快看一下。我还看到他们添加了一个标志以切换到yarn。那很棒。 - Marc-Andre R.
这个很好用,解决了问题。正如@Bo所评论的那样,你可以将它放在lerna.json中,作为"hoist": "**" - rdamborsky
只是一个快速的更新。我们最近切换到了yarn,并将时间缩短了一半。唯一需要注意的是,您必须使用--concurrency=1参数调用lerna,但即使我们从默认值4降至1并发运行,仍然将时间减半。老实说,我还没有尝试过hoist参数。如果我们尝试了它,我会发布更新的。 - Marc-Andre R.

5
截至2017年8月,Yarn包含一个名为工作区的功能,正好可以做到这一点。但更好的是,Lerna可以通过--use-workspaces与之相结合。像往常一样运行lerna bootstrap,然后所有这些都将自动处理。

我完全错过了那个,所以我正在关注有关yarn和lerna的新闻。我一定会尝试一下的!谢谢指出! - Marc-Andre R.

1

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

相反,只需将单独的模块放在其自己的文件中,并使用 import mod1 from './mod' 等加载,或者继续创建单独的存储库。但是不要为每个小模块创建单独的存储库 - 只为您或其他人绝对可以重用的内容创建(即您希望发布它来帮助其他人的内容)。

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

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


感谢你的回答。昨天发布了[tag:yarn],看起来可以解决我在那里遇到的大部分问题。我会去看一下,并回来告诉你和大家它是否解决了我们大部分的问题。 - Marc-Andre R.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接