Monorepo 构建缓存命中率优化:Turborepo 配置的常见陷阱
Monorepo 构建缓存命中率优化Turborepo 配置的常见陷阱一、代码改了 1 行整个 Monorepo 重新构建Monorepo 最大的效率武器是增量构建——只重新构建有变更的包及其依赖方。但如果配置不当一次 lint 修复可能导致 30 个包全部重新编译。核心原因依赖图没写对或者输入文件范围设得太大。Turborepo 的turbo.json决定了每个 task 的缓存键。它通过两个字段计算是否命中缓存inputs哪些文件的变更会触发重新构建dependsOn依赖的上下游有哪些 task如果inputs写成[src/**]任何源码变更都会触发。但如果你改用[src/**/*.ts]且只改了.test.ts就不触发——因为有依赖过滤。flowchart TD A[git push 触发 CI] -- B[Turborepo 启动] B -- C{计算全局哈希} C -- D[遍历所有受影响包] D -- E{包级别哈希比较} E --|哈希匹配| F[从远程缓存恢复] E --|哈希不匹配| G[重新构建] F -- H[跳过构建] G -- I[执行 task] I -- J[构建产物写入缓存] H -- K{还有任务?} J -- K K --|是| D K --|否| L[构建完成]二、缓存命中率低下的五个元凶元凶一inputs范围过大// 差任何文件变更都触发 { inputs: [$TURBO_DEFAULT$] } // 好精确指定输入 { inputs: [src/**/*.ts, tsconfig.json] }$TURBO_DEFAULT$包含.gitignore追踪的所有文件。这意味着改了README.md也会导致构建缓存失效。元凶二未声明dependsOnTask B 的结果依赖 Task A 的产物但没有声明。Turborepo 不知道这个依赖关系B 用了 A 的过时产物。元凶三环境变量泄漏任何环境变量的变化都会打破缓存。特别是 CI 中GITHUB_RUN_ID、TIMESTAMP这类每次运行都不同的变量。必须用env字段显式声明需要哪些环境变量或者用globalEnv排除不稳定的变量。元凶四远程缓存未配置本地缓存只在同一个文件系统上有效。CI 的每个 Job 跑在不同的 Runner 上如果没有远程缓存每次都是全量构建。元凶五globalDependencies滥用globalDependencies里放了package.json的 root——意味着任何一个包的依赖变更都触发全局重建。三、生产级 Turborepo 配置{ $schema: https://turbo.build/schema.json, // globalEnv: 只声明需要参与哈希的全局环境变量 // 没有列在这里的变量变更不会使缓存失效 // CI 中的 GITHUB_RUN_ID 等动态变量绝不能放在这里 globalEnv: [NODE_ENV, NEXT_PUBLIC_API_URL], // globalDependencies: 真正的全局依赖文件 // 只有这些文件的变更才会全局重建 globalDependencies: [ .github/workflows/ci.yml, scripts/build-setup.sh ], tasks: { // 构建任务只依赖上游包的构建产物 build: { // dependsOn: 声明依赖关系 // ^build 表示依赖所有上游包的 build 任务 dependsOn: [^build], // inputs: 构建相关的输入文件 // 只包含影响构建结果的文件排除测试文件和文档 inputs: [ src/**/*.ts, src/**/*.tsx, tsconfig.json, next.config.js, $TURBO_DEFAULT$ ], // outputs: 声明产物目录用于缓存和依赖消费 // 下游包的 dependsOn 会引用这些产物 outputs: [dist/**, .next/**, !.next/cache/**], cache: true }, // 类型检查独立于构建任务的缓存策略 // 独立任务的价值在于——可以单独重跑而不影响构建 typecheck: { dependsOn: [^build], inputs: [ src/**/*.ts, src/**/*.tsx, tsconfig.json ], outputs: [], cache: true }, // 测试任务对依赖要求严格 test: { // dependsOn 可以同时依赖 build 和 typecheck dependsOn: [build, typecheck], inputs: [ src/**/*.ts, src/**/*.tsx, src/**/*.test.ts, src/**/*.test.tsx, jest.config.js, tsconfig.json ], outputs: [coverage/**], cache: true }, // Lint 任务最快的缓存路径 lint: { // lint 不依赖任何上游独立执行 dependsOn: [], inputs: [ src/**/*.{ts,tsx,js,jsx}, .eslintrc.js, .eslintignore ], outputs: [], cache: true }, // dev: 开发模式禁用缓存 dev: { cache: false, persistent: true } } }关键配置解析dependsOn: [^build]中的^表示上游依赖的包。Turborepo 读取package.json中的dependencies字段自动推断依赖图。^build告诉它本包的 build 依赖所有上游包的 build 先完成。outputs: [!.next/cache/**]中的!表示排除。.next/cache是 Next.js 的构建缓存目录包含时间戳等不稳定内容不应当被 Turborepo 缓存。四、缓存命中率的衡量与优化如何衡量命中率# Turborepo 提供了详细的缓存日志 turbo run build --summarize # 生成的 .turbo/runs/*.json 中包含详细的缓存命中统计关键指标Full Turbo 命中包本身无变更 上游无变更从缓存完整恢复局部重建上游有变更但本包无变更只需重新链接全量构建本包有变更必须重建理想命中率日常开发 85%CI 环境 60%。优化策略拆分大型包一个包太大时任何局部变更都导致本包重建。拆小后可以减少影响面。产物而非源码传递下游包引用的应该是上游包的构建产物而非源码。这是dependsOn链的核心价值。定期清理远程缓存Vercel Remote Cache 的免费额度 2GB/月超限后走 fallback 全量构建。五、总结Turborepo 的缓存看似开箱即用实则 90% 的中大型 Monorepo 都没配对。核心就三件事inputs精确化、dependsOn图正确、globalEnv最小化。这三件事做到位缓存命中率从 30% 提升到 80% 是常规操作。

相关新闻

Go 中间件链的工程化设计:从 func 嵌套到责任链模式的演进

Go 中间件链的工程化设计:从 func 嵌套到责任链模式的演进

Go 中间件链的工程化设计:从 func 嵌套到责任链模式的演进 一、中间件的洋葱之困:当 10 层嵌套让你的调试变成俄罗斯套娃 Go 的 HTTP 中间件采用经典的洋葱模型:请求从外到内经过各层中间件,到达核心 handler 后再从内到外返回。最…

2026/7/9 9:25:32阅读更多 →
D3KeyHelper终极指南:解放双手,暗黑3宏工具让你专注游戏策略

D3KeyHelper终极指南:解放双手,暗黑3宏工具让你专注游戏策略

D3KeyHelper终极指南:解放双手,暗黑3宏工具让你专注游戏策略 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 厌倦了在《暗黑破…

2026/7/9 9:25:32阅读更多 →
终极i茅台自动预约系统:一站式解决方案告别手动抢购烦恼

终极i茅台自动预约系统:一站式解决方案告别手动抢购烦恼

终极i茅台自动预约系统:一站式解决方案告别手动抢购烦恼 【免费下载链接】campus-imaotai i茅台app自动预约,每日自动预约,支持docker一键部署(本项目不提供成品,使用的是已淘汰的算法) 项目地址: https:…

2026/7/9 9:25:32阅读更多 →
告别云端依赖:如何用5分钟实现美的智能家电本地局域网控制

告别云端依赖:如何用5分钟实现美的智能家电本地局域网控制

告别云端依赖:如何用5分钟实现美的智能家电本地局域网控制 【免费下载链接】midea_ac_lan Auto-configure and then control your Midea M-Smart devices (Air conditioner, Fan, Water heater, Washer, etc) via local area network. 项目地址: https://gitcode.…

2026/7/9 10:35:44阅读更多 →
Adobe-GenP 3.0:解锁Adobe全家桶的智能破解方案

Adobe-GenP 3.0:解锁Adobe全家桶的智能破解方案

Adobe-GenP 3.0:解锁Adobe全家桶的智能破解方案 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP Adobe Creative Cloud系列软件是创意工作者的必备工具&a…

2026/7/9 10:35:44阅读更多 →
Okbiye 毕业论文专属创作模块:一站式打通毕业生论文全流程创作痛点

Okbiye 毕业论文专属创作模块:一站式打通毕业生论文全流程创作痛点

okbiye-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/科研绘图毕业论文 - Okbiye智能写作https://www.okbiye.com/ai/bylw 一、独立热门论文分区,专属学术模型适配长篇毕业论文创作 平台左侧导航栏将各类学术写作需求清晰拆分,毕业论文功…

2026/7/9 10:35:44阅读更多 →
086、损失函数设计指南:从L1到感知损失,如何选择与组合超分损失

086、损失函数设计指南:从L1到感知损失,如何选择与组合超分损失

086、损失函数设计指南:从L1到感知损失,如何选择与组合超分损失去年调一个轻量级超分模型,跑了两周,PSNR死活卡在32.5dB上不去。换了几种网络结构,数据增强也加了,甚至把学习率调度策略翻了个底朝天——结果…

2026/7/9 10:35:44阅读更多 →
YOLO26涨点改进| CVPR 2026顶会| 独家卷积+Mamba改进篇| 引入AKCMamba-YOLO中的CAKCMamba模块,助力小目标检测、遥感目标检测、图像分类、图像分割任务,高效涨点

YOLO26涨点改进| CVPR 2026顶会| 独家卷积+Mamba改进篇| 引入AKCMamba-YOLO中的CAKCMamba模块,助力小目标检测、遥感目标检测、图像分类、图像分割任务,高效涨点

一、本文介绍 🔥本文给大家介绍使用 引入AKCMamba-YOLO中的CAKCMamba模块 改进YOLO26网络模型,CAKCMamba 通过 AKConv/CAKC 自适应调整卷积采样位置,增强对不同尺度、不同形状和不规则目标的局部感知能力;再利用 AKSS2D/Mamba 状态空间模型沿二维空间方向建模长距离依赖关…

2026/7/9 10:35:44阅读更多 →
终极指南:如何将你的旧电视盒子变身高性能Armbian服务器

终极指南:如何将你的旧电视盒子变身高性能Armbian服务器

终极指南:如何将你的旧电视盒子变身高性能Armbian服务器 【免费下载链接】amlogic-s9xxx-armbian Supports running Armbian on Amlogic, Allwinner, and Rockchip devices. Support a311d, s922x, s905x3, s905x2, s912, s905d, s905x, s905w, s905, s905l, rk3588…

2026/7/9 10:30:44阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/9 5:56:19阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/9 9:45:20阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/9 2:47:07阅读更多 →
Three.js 着色器光效教程

Three.js 着色器光效教程

着色器光效 Shader Light ▶ 在线运行案例 案例合集: 三维可视化功能案例(threehub.cn)开源仓库github地址: https://github.com/z2586300277/three-cesium-examples400个案例代码: 网盘链接 你将学到什么 ShaderMaterial 自…

2026/7/9 0:04:37阅读更多 →
如何5分钟掌握CS2智能库存管理:开源工具CASEMOVE终极指南

如何5分钟掌握CS2智能库存管理:开源工具CASEMOVE终极指南

如何5分钟掌握CS2智能库存管理:开源工具CASEMOVE终极指南 【免费下载链接】casemove A dedicated desktop app that enables you to move items in and out of storage units in CS2. 项目地址: https://gitcode.com/gh_mirrors/ca/casemove 还在为CS2存储单…

2026/7/9 0:04:37阅读更多 →
GBase 8a vs MySQL 8.0:ALTER TABLE语法与限制的5点关键差异对比

GBase 8a vs MySQL 8.0:ALTER TABLE语法与限制的5点关键差异对比

GBase 8a与MySQL 8.0:ALTER TABLE语法差异深度解析与实战指南1. 两种数据库的ALTER TABLE能力全景对比在数据库架构设计和运维过程中,表结构变更(DDL操作)是不可避免的需求。GBase 8a作为国产分析型数据库代表,与开源M…

2026/7/9 0:04:37阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/9 9:45:20阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/8 13:42:39阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/8 13:42:39阅读更多 →