6

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

当前的项目结构如下所示

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

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

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

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

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

4

3 回答 3

6

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

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

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

于 2017-03-02T19:17:05.130 回答
5

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

于 2017-10-19T22:54:53.970 回答
0

我建议根本不要使用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

于 2016-09-28T02:43:42.533 回答