https://www.jianshu.com/p/dafc2052eedc
https://www.jianshu.com/p/c10d0b8c5581
Monorepo(monolithic repository) 是管理项目代码的一个方式,指在一个项目仓库 (repo) 中管理多个模块/包 (package),不同于常见的每个模块建一个 repo。
目前不少大型开源项目采用了这种方式,如 Babel
、React
、Vue
等。monorepo 管理代码只要搭建一套脚手架,就能管理(构建、测试、发布)多个 package。
在项目的第一级目录的内容以脚手架为主,主要内容都在 packages
目录中、分多个 package 进行管理。目录结构大致如下:
├── packages
| ├── pkg1
| | ├── package.json
| ├── pkg2
| | ├── package.json
├── package.json
此时会有一个问题,虽然拆分子 npm 包管理项目简单了很多,但是当仓库内容有关联时,调试变得困难。所以理想的开发环境应该是只关心业务代码,可以直接跨业务复用而不关心复用方式,调试时所有代码都在源码中。
目前最常见的 monorepo 解决方案是 lerna 和 yarn 的 workspaces 特性。用 yarn 处理依赖问题,lerna处理发布问题。
可见性(Visibility):每个人都可以看到其他人的代码,这样可以带来更好的协作和跨团队贡献——不同团队的开发人员都可以修复代码中的bug,而你甚至都不知道这个bug的存在。
更简单的依赖关系管理(Simpler dependency management):共享依赖关系很简单,因为所有模块都托管在同一个存储库中,因此都不需要包管理器。
唯一依赖源(Single source of truth):每个依赖只有一个版本,意味着没有版本冲突,没有依赖地狱。
一致性(Consistency):当你把所有代码库放在一个地方时,执行代码质量标准和统一的风格会更容易。
共享时间线(Shared timeline):API或共享库的变更会立即被暴露出来,迫使不同团队提前沟通合作,每个人都得努力跟上变化。
原子提交(Atomic commits):原子提交使大规模重构更容易,开发人员可以在一次提交中更新多个包或项目。
隐式CI(Implicit CI):因为所有代码已经统一维护在一个地方,因此可以保证持续集成[3]。
统一的CI/CD(Unified CI/CD):可以为代码库中的每个项目使用相同的CI/CD[4]部署流程。
统一的构建流程(Unified build process):代码库中的每个应用程序可以共享一致的构建流程[5]。
随着单一代码库的发展,我们在版本控制工具、构建系统和持续集成流水线方面达到了设计极限。这些问题可能会让一家公司走上多代码库的道路:
在构建和发布之前还需要做一些关于代码提交的配置
commitizen 是用来格式化 git commit message 的工具,它提供了一种问询式的方式去获取所需的提交信息。
cz-lerna-changelog 是专门为 Lerna 项目量身定制的提交规范,在问询的过程,会有类似影响哪些 package 的选择。
许多大公司的构建系统都是开源的:
Monorepos正在获得越来越多的关注,尤其是在JavaScript方面,如下项目所示:
扩展代码库
源代码控制是单一代码库的另一个痛点,这些工具可以帮助您扩展存储库:
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。