Turborepo 是面向 JavaScript/TypeScript monorepo 的构建系统,用于处理跨工作区的任务编排、缓存和依赖感知执行。
用途 它适用于管理包含多个应用与包的单体仓库(monorepo),让构建、测试、lint 等任务按依赖关系有序、并行地运行,并通过缓存避免重复执行。
安装与初始化 新建 monorepo:npx create-turbo@latest my-monorepo。向已有仓库添加:pnpm add turbo --save-dev --workspace-root,或 npm install turbo --save-dev。需要把 .turbo 加入 .gitignore,并在根 package.json 中添加脚本,例如 "build": "turbo run build"、"dev": "turbo run dev"、"test": "turbo run test"、"lint": "turbo run lint"。
主要能力
- 任务配置:在 turbo.json 中通过 tasks 定义任务。dependsOn 指定必须先完成的任务,^ 前缀表示拓扑顺序(先跑上游工作区);outputs 列出任务产物用于缓存;cache 设为 false 可禁用缓存;persistent 标记常驻任务(如 dev 服务器);env 指定影响任务哈希的环境变量。注意 Turborepo v2 使用 "tasks" 键,替代 v1 的 "pipeline"。
- 任务编排:turbo run build 运行全部工作区;turbo run lint build test 运行多个任务;--concurrency=4 或 --concurrency=50% 限制并行度。
- 任务依赖:"^build" 表示先在上游工作区依赖中运行 build;不带 ^ 的 "lint" 表示先在同一工作区运行 lint。可在工作区目录放置 turbo.json 并用 "extends": ["//"] 做单工作区覆盖。
- 缓存:Turbo 对输入(源文件、依赖、环境变量、配置)做哈希并缓存任务输出,命中缓存时恢复输出并重放日志而不重新执行。--no-cache 跳过读取缓存,--force 忽略缓存全部重新执行。远程缓存可用 npx turbo login 与 npx turbo link 连接 Vercel 共享缓存,或通过 --api 与 --token 指定自托管端点。
- 环境变量:env 影响该任务的缓存哈希,globalEnv 影响所有任务,passThroughEnv 会把变量传给任务但不计入哈希(适合密钥)。
- 筛选:--filter=web(工作区名)、--filter=@myorg/ui(包名)、--filter=./apps/*(路径 glob)、--filter=...@myorg/ui(包及其依赖者)、--filter=@myorg/ui...(包及其依赖)、--filter=...[HEAD~1](自上次提交以来变更)、--filter=...[main...HEAD](相对 main 分支变更),以及用 --filter=!./apps/admin 排除。
- 共享包:内部 UI 库可在 package.json 中把 main 与 types 指向源码,由消费方打包器转译时无需构建步骤;也可用 tsup 等构建。内部依赖使用 workspace:* 协议。共享 TypeScript 配置可放在 packages/tsconfig/base.json,通过 extends 引用。共享类型包同理解释。
- pnpm 工作区:pnpm-workspace.yaml 中声明 packages 列表(如 apps/、packages/);npm 工作区则使用根 package.json 的 workspaces 字段。
- 监视模式:turbo watch dev、turbo watch build 监听文件变化,按依赖图重跑受影响任务,共享包变化会触发下游重建。
- Docker 精简:turbo prune web --docker 生成 out/json/(用于安装层的精简 package.json)与 out/full/(精简源码),配合多阶段 Dockerfile 使用。
- CI/CD:在 GitHub Actions 中配合远程缓存,设置 TURBO_TOKEN 与 TURBO_TEAM,用 turbo run build test --filter=...[origin/main...HEAD] 只跑受影响任务;turbo run build --dry-run=json 可获取任务图以分派并行 CI 作业。
- 迁移:从 Lerna 迁移时移除 lerna.json 与依赖、保留工作区配置、新建 turbo.json、用 turbo run 替换 lerna run,用 --filter 替换 --scope;从 Nx 迁移时移除 nx.json 与 project.json、把目标配置转入 turbo.json 的 tasks,用 turbo run 替换 nx run-many / nx affected。差异在于 Nx 使用每个项目的 project.json 与自带依赖分析,Turbo 使用单一根 turbo.json 并依赖包管理器的工作区图;Nx 有 generators/executors,Turbo 则委托给各工作区 package.json 脚本。
排障命令 turbo run build --dry-run 显示将要运行的任务;--graph 输出 DOT 格式任务图;--summarize 生成运行摘要 JSON;turbo ls 列出工作区,turbo ls --filter=./packages/* 列出筛选后的工作区;TURBO_LOG_VERBOSITY=debug turbo run build 用于调试缓存未命中。
适合场景 需要在一个仓库内管理多个应用与包、希望按依赖顺序并行执行任务、减少重复构建并共享缓存的 JavaScript/TypeScript 项目。
限制 资料未提供 Turborepo 的收费、价格、官方支持平台范围等具体信息;文中未提及的功能与细节以暂未提供为准。