V2EX 09月16日
Monorepo 的优缺点与实践考量
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

Monorepo 模式将多个项目置于同一代码仓库,旨在简化开发流程,如统一编辑器管理、代码共享和集中 CI/CD。然而,跨语言项目可能因规范不一而难以实现统一配置。即使是同语言项目,前期架构设计也需投入大量精力,尤其是在配置共享包(如 ESLint、Prettier)时,可能需要为不同框架(如 Next.js)定制配置,反而增加了复杂性。此外,权限管理也是一个挑战。相比之下,Multirepo 模式在权限控制、项目内聚性以及“开箱即用”的开发体验上更具优势,代码共享也可通过私有 npm 包实现,项目独立迭代更方便,个人认为 Monorepo 的实际收益有限。

📦 **Monorepo 的潜在优势**:将多个项目集中管理,便于一人维护多个子包时避免编辑器切换;可实现代码(如 Lint、Prettier 配置)和类型(TypeScript)的共享,简化跨包依赖;统一的 CI/CD 流程可减少心智负担。

🛠️ **Monorepo 的配置挑战**:跨语言项目难以统一 Lint/Prettier 规则;即使是同语言项目,创建和维护共享配置包(如 `eslint-config`、`prettier-config`)需要大量前期投入;为特定框架(如 Next.js)定制共享配置会增加复杂性,可能与框架的开箱即用特性相悖;强制统一配置可能牺牲项目原有的便捷性。

🔒 **Monorepo 的权限与 Multirepo 的优势**:Monorepo 的权限管理是一个考量点,需要防止代码被随意复制;Multirepo 模式提供了更好的权限控制和项目内聚性,项目可直接上手开发,避免不必要的配置折腾;重复代码影响不大,存储成本低;代码共享可通过私有 npm 包实现,项目重构或更换语言时影响范围小,仅需保持对外接口一致。

让你陷入无限折腾中。

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 的项目用的多不多,都用在什么场景?

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Monorepo Multirepo 代码管理 开发实践 工程化 CI/CD TypeScript ESLint Prettier
相关文章