我有一个使用单片存储库的项目。每个包都有自己的package.json文件来管理所述包的依赖关系。我使用lerna
在所有"子包中安装包"我们的monorepo app。
当前的项目结构如下所示
Project/ | package.json | node_modules/ |- packages/ |-- package1/ |--- package.json |--- node_modules/ |-- package2/ |--- package.json |--- node_modules/
我正在寻找一种在根node_modules文件夹中概括公共依赖项的方法,这样每个包在运行lerna exec -- npm install
时都不会提取自己的节点包副本,而是使用那个是整体仓库的根源所以我们避免在多个仓库中安装相同的包,因此减少了项目的规模。
我已经看到了一些解决方案,包括在项目之间制作一些符号链接,但这似乎并不是一门精确的科学,因为符号链接支持非常适合操作系统。此外,这似乎不是一种支持的方式。
目前,我们刚刚开始,在运行lerna exec -- npm install
之后,该项目已经在磁盘上大约350mb,从npm开始拉动所有内容大约需要5分钟。随着项目的不断发展,这段时间也会随着时间的推移而延长......
因此,为了恢复所有内容,我正在寻找一种方法来提取repo根目录下的node_modules文件夹中的公共依赖项,并使子包从此文件夹中拉出它们的公共依赖项而不是获取它们自己的每次复制。
答案 0 :(得分:6)
Lerna最近添加了--hoist
选项,看起来它提供了您在这里寻找的确切内容。它在repo root上安装外部依赖项,因此它们可供所有程序包使用。二进制文件链接到依赖包node_modules/.bin/
目录,因此它们可用于npm脚本。
可以在命令行上传递,也可以添加到lerna.json
以进行持久配置。
答案 1 :(得分:5)
截至2017年8月,Yarn包含一项名为Workspaces的功能,正是如此。但更好的是,Lerna可以通过--use-workspaces
了解并与之融为一体。像往常一样运行lerna bootstrap
将自动处理所有这些。
答案 2 :(得分:-1)
我建议不要使用lerna
。我认为这是一个误入歧途的想法。
相反,只需将单独的模块放在自己的文件中,然后加载import mod1 from './mod
'等或继续创建单独的回购。但是,不要为每个小模块创建单独的存储库 - 只需要您或其他人可以重复使用的内容(即您希望将其发布以帮助其他人)。
您可以利用npm link
,范围包,在package.json中使用dependencies:{"mod1":"myorg/mod1"}
列出github repos,以便更容易将其放在单独的仓库中(必要时)。
特别是npm link
应简化事情。 http://justjs.com/posts/npm-link-developing-your-own-npm-modules-without-tears