multi-repo和mono-repo简介
这是两种代码仓库的管理风格:
- multi-repo:每个项目都用一个git仓库托管。
- mono-repo:统一用一个git仓库管理所有的项目。
multi-repo
大多数工程其实都是以multi-repo方式管理的
优势:
- 可以让各项目团队根据需要,定制更适合自己的workflow
不足:
- 难以对所有项目统一进行操作 (git checkout/npm publish/npm run build..·)
- 难以追踪依赖关系 (a一b-c)
mono-repo
广泛应用于一些知名开源项目和硅谷巨头 (React/Angular /Vuetify /Google)
优势:
- 方便统一地操作各个项目 (git checkout/npm publish/npm run build..·)
- 利用工具,可以方便地追踪项目间的依赖关系
不足:
- 代码库随着业务发展会非常巨大
- 失去了部分的灵活性 (workflow必须统一)
- 强依赖于mono-repo的管理工具
multi-repo的管理工具 - git submodule
- git提供的一种管理子仓库的方案
- 可以批量管理和维护多个git repo
- 本质上是一个父repo维护了一份各个子repo 的清单
- 有坑: Git Submodule的坑
- 替代方案: git subtree
# 初始化git submodules仓库
git submodule init
# 添加一个submodule
git submodule add https://github.com/chaconinc/DbConnector
# 更新所有的submodule
git submodule update
# 查看submodule的状态
git submodule status
# foreach 用于在每个submodule中执行命令
git submodule foreach 'git checkout -b featureA'
mono-repo的管理工具 - lerna
- 为JS生态下的mono-repo管理提供一站式的解决方案
- babel/create-react-app /jest /react-router /umi/ nestjs ...
- 解决了mono-repo下的依赖管理、版本管理、开发提效、工作流 ...
目录结果
- 整体作为一个Git仓库,也是个npm包(私有)
- lerna.json是整个mono-repo的配置文件
- 每个真正的项目,平铺在 packages/中
- 整个项目可以统一管理所有依赖 (也可以分别管理)
lerna 常见 命令
Lerna -h #help
Lerna add <pkg>[ globs..] #Add a single dependency to matched packages
lerna bootstrap #Link local packages together and install remaining package dependencies
lerna changed #List local packages that have changed since the last tagged release
lerna clean #Remove the node_modules directory from all packages
lerna create <name> [loc] #Create a new lerna-managed package
lerna diff [pkgName] #Diff all packages or a single package since the last release
lerna exec [cmd] [args..] #Execute an arbitrary mcommand in each package
lerna init #Create a new Lerna repo or upgrade an existing repo to the current version of LernaSymlink
lerna link #together all packages that are dependencies of each other
lerna publish [bump] #Publish packages in the current project.
lerna run <script> #Run an npm script in each package that contains that script
lerna 配置
其实只有几个主要字段: version、npm*、command、packages。全部配置见:json schema
- version:决定fixed mode/independentmode
- packages:项目的路径
- npm*:解耦包管理工具
{
"version":"1.1.3",
"npmClient":"npm",
"npmClientArgs":["--pure-lockfile"],
"command":{
"publish":{
"ignoreChanges": ["ignored-file","*.md"],
"message":"chore( release): publish",
"registry":"https://npm.pkg.github.com"
},
"bootstrap": {
"ignore":"component-*",
"npmClientArgs": ["--no-package-lock"]
}
},
"packages":["packages/*"]
}
lerna 使用的注意事项
- mono-repo 不可嵌套
- mono-repo的主仓库必须是私有的 (package.json中设置 private: true )
- 如果你的仓库对私密性要求非常高,甚至可以不用npm而使用git引用依赖
lerna外的选择 - NX
- Angular出品
- 框架强相关,支持:Angular、 React
- 支持插件机制
- 远超monorepo管理的强大的功能
文档见:NX