标准答案
- 先维护 workspace 依赖图,知道应用和包之间的引用关系。
- 根据 git diff 判断哪些文件变化,再沿依赖图找出受影响项目。
- 缓存 key 要包含源码、lockfile、构建配置、环境变量和命令参数。
- CI 中可以把 lint、test、build 拆成可缓存任务。
- 缓存命中要可解释,不能为了快而跳过真正受影响的检查。
题目解析
Monorepo 规模变大后,如果任何改动都全量构建,CI 会越来越慢。增量构建的目标是把检查范围缩到受影响项目。
依赖图是基础。改了底层 shared 包,所有依赖它的应用都可能受影响;只改某个应用页面,则不应该触发无关应用构建。
缓存要谨慎。环境变量、lockfile、构建配置变化都可能改变产物,缓存 key 如果漏了这些输入,就会拿到错误结果。
常见误区
- Monorepo 仍然每次全量构建,CI 时间不可控。
- 只按文件路径判断影响范围,不看包之间依赖关系。
- 缓存 key 过粗,依赖或配置变了仍复用旧产物。