Monorepo 就是个大坑

7 天前
 BeijingBaby

让你陷入无限折腾中。

monorepo 听起来很美好,多个项目作为子包放在同一个 repo 中,一般常听见的优点有:

1 、一次打开所有项目,尤其是一个人需要修改或维护多个项目(子包)时,不用来回切换编辑器,很直观。

2 、子包共享代码,如代码质量相关的 eslint 、prettier 、或跨 package 的代码等都可以给其他 pkg 的共享。

3 、类型共享,如前后端都是 ts 所写,则 types 可以共享不用重复定义或者担心迭代中产生不一致。

4 、ci/cd ,可以统一为整个 repo 做 ci/cd ,不再分散增加心智负担。

但是,monorepo 会给你带来无限的折腾。

首先,如果是跨语言的 mononrepo ,不同语言有不同的编码规范,根本不存在相同的 lint 或 prettier 。ci/cd 也相当于是独立项目要单独做,共享配置在这里没有带来任何好处的提升。

其次是,即使你是相同语言的 monorepo ,前期在项目架构时候也会让你消耗很多精力。

你需要创建 packages/prettier-config, packages/eslint-config...等等共享配置。

每次创建一个其他 package 你需要修改配置文件使用这些共享配置。

另外就是不同子包有不同的 eslint 配置,如 nextjs 和普通的 reactjs 项目就有不同的配置,你要么在 eslint-config 中再来一份针对 nextjs 的配置,然后修改 apps/web 引用,要么就干脆直接继承 eslint-config 再扩展 nextjs 官方推荐的配置。

这个过程非常折腾,本身 nextjs 这类项目就是开箱即用,已经有合适的 eslint 配置,你非要提取到共享的 package 中,可能大多数情况你的 monrepo 就不存在多个 nextjs 项目共享配置的情况!

好了,此时再来一个 nestjs 作为后端 api ,还得再折腾一遍 prettier-config ,eslint-config ,毕竟你都共享配置了,必须得用不是吗?

直接把这些项目的开箱即用抛弃了。

然后你的项目中要用 tailwind 或者 shadcn-ui ,你就会重复以上步骤,陷入无限的配置折腾中。

另外就是权限怎么管理,你总不想任何人都有整个 monorepo 的代码权限吧?实习生来几天直接给你代码拷走了。

multirepo 有问题吗?

其实一点问题都没有,更好的权限权利,更内聚。

一些项目本身开箱即用,创建好就能开始写业务,不用折腾什么共享配置。

或者每个项目有一些重复代码也没有任何影响,存储空间又不费钱,但是更内聚了。

要是有需求多个 repo 代码共享,统一标准,一样可以发布私有 npm 包来实现。

项目迭代中某个 repo 重构或者换语言,都根本不用考虑其他 repo ,只要对外接口保持一致就行。

个人感觉 monorepo 带来的提升很有限,不知道 v2er 的项目用的多不多,都用在什么场景?

5835 次点击
所在节点    程序员
64 条回复
RedNax
6 天前
以前我也搞 shared config ,eslint, prettier,webpack 甚至 tsconfig 啥的都放 share package ,巴不得哪怕一行共同代码都要 share 。结果遇到前后端、不同测试框架什么的简直要爆炸。
现在都不 share ,自己各写一份,也没多少,干净快捷方便。
Biggoldfish
6 天前
conn457567
6 天前
相反,monorepo 恰好是微服务和 severless 发展后的结果,现在一个应用动不动可以拆分为十几个子程序,有些子程序其实就一个目录十几个源文件而已,如果单独建仓库,管理成本太高了,所以才有 monorepo ,服务才分了但是代码不拆分。
superares
6 天前
你举的例子都是前端的,会不会是前端本身的问题?
cj323
6 天前
不怎么写 js/ts 但是我经历过 multirepo 和 monorepo, 以及 monorepo -> multi repo 和 multi repo -> monorepo. 说下我的经验和看法.

总人数在四位数/团队数在三位数以下时, 我倾向 monorepo; 总人数>五位数, 我仍然倾向 monorepo, 但是实际情况往往会走向 multirepo.

我喜欢 monorepo 是因为
1. 技术上 multirepo 解决的问题往往能用更低的成本在 monorepo 里面用模块化达成, 不管是多语言还是多环境还是什么.
2. monorepo 能带来的便利, 比如版本管理, multirepo 往往难做到而且成本不小

走向 multirepo 的情况我认为往往是因为人, 不是技术
1. 法律风险
2. 团队分歧
XTTX
6 天前
monorepo 对前端项目非常重要。apps 有 www, web, dashboard, document. ui 打包成 共享 package. 为了保证设计一致性,所有的 design token 也都是出自一出。

完全就是前期费事,后期省事。搞不明白就看那些 github repo 。复杂一点的项目都用就能说明事了。
hucw21750
6 天前
@WenhaoWu 2 样都用了
JoeJoeJoe
6 天前
@imvkmark 图床的话是 pro 和持有 1w V2EX 币才有, 但是我这个是用的插件直接粘贴上传的
darklinden
6 天前
可以折中一下,多 repo 但是有个主 fake-mono-repo 搞一堆 submodule 只管管理多 repo 的版本
这样接触工程的能从主 repo 找到 tag 版本对应的分 repo 版本,分 repo 也不必关心主 repo 干了点儿啥,修改完也可以给主 repo 提 mr
ChevalierLxc
6 天前
大家有看到过 20-30 人开发一个 repo,进一个 PR 有多难吗?
sx931210
6 天前
用 monorepo 把公司所有项目搞一个仓库都是 sha der
monorepo 只是适合把相关性高的库放一起,比如 vue/core 那样的
superrichman
6 天前
用 monorepo 管理的很多都是用 svn 用习惯了,现在流行用 git 了结果还是用以前 svn 的思路去管理,什么乱七八糟的都塞到一个 repo 里面去。
ooxiaoming
6 天前
总结没事找事
craftsmanship
6 天前
@dssxzuxc #13 太痛了 切身体会 8 年多的祖传 TS 屎山 一锤子买卖之后再也没人管过 现在让我来升 node22 人有点没了
fadaixiaohai
6 天前
跨端项目用 monorepo 挺好的,保证两边版本一致
SmiteChow
6 天前
不跨语言啊,跨语言干嘛? monorepo 概念提出来的目的就是为了共享代码的啊,其他的都是副作用,跨语言怎么共享代码?
jjx
6 天前
感觉味不对

首先,你这个是前端的角度看 monorepo , 后端怎么看?

其次, monorepo 第一有点是不切换编辑器? 当真?

第三, monorepo 大项目肯定有模块切分, 模块切分原则其实同微服务没有任何区别
Huelse
6 天前
你这属于没经验,不知道什么东西可以共用,什么东西不可以
leokun
6 天前
一直用 yarn 的 workspace ,全部装到 root 上,并且 root 是 app ,其他包放到 packages ,这套操作下来挺省心的
pluswu1986
6 天前
@WenhaoWu yon 至今没用明白 submodule

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1159728

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX