代码项目管理

679 阅读5分钟

代码的仓库的组织结构对项目的开发起到很重要的作用。

一种是多仓库(multi-repo),在微服务中就是每个服务一个源码仓库。 另一种叫单体仓库(mono-repo),虽然应用采用的微服务架构,但将所有源码放在同一个仓库。 从左到右依次为: 单体应用单体仓库(monolith),微服务多仓库(mono-repo),微服务单体仓库(mono-repo)

如图:

image.png MonoLith: 一个项目,一个 Git 仓库。

  • 场景:项目较小,开发人员较少
  • 优点:实现简单,一撸到底。
  • 缺点:复杂项目代码复用性低,且不利于团队协作。 Multi-Repo: 划分为多个模块,一个模块一个 Git 仓库
  • 场景:代码业务耦合度不高,业务相互之间并不复杂
  • 优点:模块划分清晰,每个模块都是独立的 repo,利于团队协作,集成和部署。
  • 缺点:代码管理难度增加。比如:1.某个模块出现bug 相应模块都需要编译、上线、涉及到手动控制版本非常繁琐。 2.issue 管理十分麻烦。

Mono-Repo: 划分为多个模块,所有模块放在一个 Git 仓库

  • 场景: 开发人员较多,项目之间耦合性较大,易于理解项目整体。开发人员可以把整个项目加载到本地的 IDE 当中,进行 code review,方便开发人员把握整体的技术架构和业务目标
  • 优点:代码结构清晰,利于团队协作,同时一个库降低了项目管理、代码管理以及代码调试难度。
  • 缺点:项目变得庞大,模块变多后同样会遇到各种问题。所以需要有更好的构建工具支持。

具体说下monorepo相关

什么是Monorepo

monorepo 是一种代码组织思想,它要求我们只用一个代码仓库来管理一个大项目的所有资源、子项目。简单来说以前放在多个 repo 里的代码现在就放在一个 repo 就行了。

而 Multirepo (传统多 repo 项目)会将一个项目按照职责、业务模块进行拆分,然后创建不同的代码仓库进行管理。不同的团队可以专注于负责某一个代码仓库代码提交、编译、发布。

  • 可以看到所有代码,其他项目的新提交发生后也能立刻看到。
  • 便于协同工作,不会被依赖的项目发布而耽误进度,依赖项一提交马上可用。
  • 代码重用能力提升了。内部可以很容易相互引用,一次提交,repo 中依赖于此的项目即刻同步到最新依赖。
  • 公共依赖只要安装一次,Monorepo 中所有模块都共享,也不会有多个项目依赖版本不一致的问题。
  • 统一测试、避免项目依赖导致的跨 repo 测试变得复杂。
  • 统一 CI、CD 流程,一套配置解决所有模块的测试及发布

缺点

  • 代码规模变得巨大后会造成代码加载,版本控制等的性能问题,可能造成代码编辑器加载不成功,或加载缓慢
  • 代码规模变大,大量提交、分支、tag,版本控制变得困难。比如想要通过提交日志进行 revert 操作,或 blame 等。
  • 由于项目间随意互相引用造成耦合性增加,由于代码放都放一起,可能也会造成项目间职责不明确,代码组织性降低
  • 权限问题,所有代码都可见。

如何决定是否是否 Monorepo

  • 微服务共享依赖库代码时,依赖需要统一,并独立拷贝到不同容器时选择 Monorepo。
  • 使用 CLI 工具库开发自动化测试框架时,一个自动化测试框架可以测试所有项目。
  • 在多项目开发过程中,项目职责划分明确,有不同的测试、发布流程时,就不用考虑使用 Monorepo。

git 中使用 Monorepo 的困难

  • git 在每次提交时候都会跟踪整个提交树的状态,由于项目增多,这会让 git 运行变得缓慢。 -# git 的 tag 将变得没有太大作用,比如 repo 中一个安卓项目的发版 tag 对于 repo 中的 web 项目而言是没有实际意义的。
  • 由于 git 底层使用有向无环图实现历史记录。提交的激增导致 git log, git blame 变得缓慢。
  • git 分支也会由于项目激增而激增,这些也会拖慢 git branch 的运行。
  • 大文件存储会影响整个 repo 的性能(这在 git LFS (Large File Storage)中有得到解决)。
  • git clone、git fetch、git push、git status 等都会因为文件数激增变得缓慢。

Monorepo实现方案

yarn workspace + lerna

  • yarn workspaces 管理包的依赖。
  • lerna 用来管理发布,统一执行命令,如测试等

pnpm + lerna

  • pnpm workspaces 更纯粹,支持--filter命令;优化掉幻影依赖问题;更好的隔离方案和内存管理。
  • lerna 用来管理发布,统一执行命令,如测试等,比如很多时候我们并不需要统一版本发布管理,其实只用pnpm workspace就行

demo地址:github.com/lecheng-lc/…

# 开源项目都在用 monorepo,但是你知道居然有那么多坑么?
# lerna+yarn workspace+monorepo项目的最佳实践
# 基于 lerna 和 yarn workspace 的 monorepo 工作流
# yarn workspace、lerna介绍
# 使用lerna管理大型前端项目
# lerna的基础使用 www.jianshu.com/p/990afa30b…
# Vue3.0 中的 monorepo 管理模式
# 为什么使用pnpm可以光速建立好用的monorepo(比yarn/lerna效率高)
# 推荐使用 pnpm + lerna + ts来管理monorepo!
# 使用pnpm做monorepo
# 青训营】基于 pnpm 的 monorepo 包管理实践
# pnpm monorepo
# [译]用 PNPM Workspaces 替换 Lerna + Yarn
# monorepo,lerna,yarn workspace
# Yarn Workspace使用指南