想在 CI 里只构建受影响的包,写了 turbo run build --filter=...[HEAD^1],日志显示 18 个包全部执行,构建时间还是 9 分钟。乍看像缓存或者权限的锅,追下去往往不是。
git fetch --depth=2 origin main npx turbo run build --filter='...[origin/main]' --dry=json npx turbo run build --filter='...[origin/main]'
追下去是这么回事:三个点的语法表示包含该包的依赖方,放在前面会把上游全部拉进来,方向记反就退化成全量。CI 是浅克隆,HEAD^1 不存在时过滤器匹配不到基准,也会跑全部项目。
「turbo filter 语法」这类改动最怕改一半,回滚脚本先准备好,再动生产。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。别只看报错的最后一行,往上看几行,真正的起因通常在上面。
具体做法是,用 --dry=json 先看过滤器命中的包列表;确认 clone 深度足够 HEAD^1 能解析 必要时 fetch 两个提交;把过滤器改成 ...[origin/main] 或直接指定包名;在流水线里打印命中数量 超过预期就中断。
验收就看一点,dry-run 里的包数量和本次改动范围一致 构建时长从 9 分钟降到 2 分钟内。
