Skip to main content 首页 创作者 beko2210 firstbrain turborepo-caching
turborepo-caching Configure Turborepo for efficient monorepo builds with local and remote caching. Use when setting up Turborepo, optimizing build pipelines, or implementing distributed caching.
跳到安装 Skills Marketplace 发现并探索由社区构建的 Agent Skills
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/BEKO2210/Firstbrain --skill turborepo-caching命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
下载 Zip 下载中... name turborepo-caching description Configure Turborepo for efficient monorepo builds with local and remote caching. Use when setting up Turborepo, optimizing build pipelines, or implementing distributed caching. type skill created 2026-02-27T00:00:00.000Z domain software-development category architecture risk critical source community tags ["skill","software-development","architecture","turborepo","caching"]
Turborepo Caching
Production patterns for Turborepo build optimization.
Do not use this skill when
The task is unrelated to turborepo caching
You need a different domain or tool outside this scope
Instructions
Clarify goals, constraints, and required inputs.
Apply relevant best practices and validate outcomes.
Provide actionable steps and verification.
If detailed examples are required, open resources/implementation-playbook.md.
Use this skill when
Setting up new Turborepo projects
Configuring build pipelines
Implementing remote caching
Optimizing CI/CD performance
Migrating from other monorepo tools
Debugging cache misses
Core Concepts
1. Turborepo Architecture
Workspace Root/
├── apps/
│ ├── web/
│ │ └── package.json
│ └── docs/
│ └── package.json
├── packages/
│ ├── ui/
│ │ └── package.json
│ └── config/
│ └── package.json
├── turbo.json
└── package.json
2. Pipeline Concepts
Concept Description dependsOn Tasks that must complete first cache Whether to cache outputs outputs Files to cache inputs Files that affect cache key persistent Long-running tasks (dev servers)
Templates
Template 1: turbo.json Configuration
{
"$schema" : "https://turbo.build/schema.json" ,
"globalDependencies" : [
".env" ,
".env.local"
] ,
"globalEnv" :
[
"NODE_ENV"
,
"VERCEL_URL"
]
,
"pipeline"
:
{
"build"
:
{
"dependsOn"
:
[
"^build"
]
,
"outputs"
:
[
"dist/**"
,
".next/**"
,
"!.next/cache/**"
]
,
"env"
:
[
"API_URL"
,
"NEXT_PUBLIC_*"
]
}
,
"test"
:
{
"dependsOn"
:
[
"build"
]
,
"outputs"
:
[
"coverage/**"
]
,
"inputs"
:
[
"src/**/*.tsx"
,
"src/**/*.ts"
,
"test/**/*.ts"
]
}
,
"lint"
:
{
"outputs"
:
[
]
,
"cache"
:
true
}
,
"typecheck"
:
{
"dependsOn"
:
[
"^build"
]
,
"outputs"
:
[
]
}
,
"dev"
:
{
"cache"
:
false
,
"persistent"
:
true
}
,
"clean"
:
{
"cache"
:
false
}
}
}
Template 2: Package-Specific Pipeline
{
"$schema" : "https://turbo.build/schema.json" ,
"extends" : [ "//" ] ,
"pipeline" : {
"build" : {
"outputs" : [ ".next/**" , "!.next/cache/**" ] ,
"env" : [
"NEXT_PUBLIC_API_URL" ,
"NEXT_PUBLIC_ANALYTICS_ID"
]
} ,
"test" : {
"outputs" : [ "coverage/**" ] ,
"inputs" : [
"src/**" ,
"tests/**" ,
"jest.config.js"
]
}
}
}
Template 3: Remote Caching with Vercel
npx turbo login
npx turbo link
turbo build --remote-only
TURBO_TOKEN=your-token
TURBO_TEAM=your-team
name: CI
on:
push:
branches: [main ]
pull_request:
env:
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
TURBO_TEAM: ${{ vars.TURBO_TEAM }}
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Build
run: npx turbo build --filter='...[origin/main]'
- name: Test
run: npx turbo test --filter='...[origin/main]'
Template 4: Self-Hosted Remote Cache
import express from 'express' ;
import { createReadStream, createWriteStream } from 'fs' ;
import { mkdir } from 'fs/promises' ;
import { join } from 'path' ;
const app = express ();
const CACHE_DIR = './cache' ;
app.get ('/v8/artifacts/:hash' , async (req, res) => {
const { hash } = req.params ;
const team = req.query .teamId || 'default' ;
const filePath = join (CACHE_DIR , team, hash);
try {
const stream = createReadStream (filePath);
stream.pipe (res);
} catch {
res.status (404 ).send ('Not found' );
}
});
app.put ('/v8/artifacts/:hash' , async (req, res) => {
const { hash } = req.params ;
const team = req.query .teamId || 'default' ;
const dir = join (CACHE_DIR , team);
const filePath = join (dir, hash);
await mkdir (dir, { recursive : true });
const stream = createWriteStream (filePath);
req.pipe (stream);
stream.on ('finish' , () => {
res.json ({ urls : [`${req.protocol} ://${req.get('host' )} /v8/artifacts/${hash} ` ] });
});
});
app.head ('/v8/artifacts/:hash' , async (req, res) => {
const { hash } = req.params ;
const team = req.query .teamId || 'default' ;
const filePath = join (CACHE_DIR , team, hash);
try {
await fs.access (filePath);
res.status (200 ).end ();
} catch {
res.status (404 ).end ();
}
});
app.listen (3000 );
{
"remoteCache" : {
"signature" : false
}
}
turbo build --api="http://localhost:3000" --token="my-token" --team="my-team"
Template 5: Filtering and Scoping
turbo build --filter=@myorg/web
turbo build --filter=@myorg/web...
turbo build --filter=...@myorg/ui
turbo build --filter='...[origin/main]'
turbo build --filter='./apps/*'
turbo build --filter=@myorg/web --filter=@myorg/docs
turbo build --filter='!@myorg/docs'
turbo build --filter='...[HEAD^1]...'
Template 6: Advanced Pipeline Configuration {
"$schema" : "https://turbo.build/schema.json" ,
"pipeline" : {
"build" : {
"dependsOn" : [ "^build" ] ,
"outputs" : [ "dist/**" ] ,
"inputs" : [
"$TURBO_DEFAULT$" ,
"!**/*.md" ,
"!**/*.test.*"
]
} ,
"test" : {
"dependsOn" : [ "^build" ] ,
"outputs" : [ "coverage/**" ] ,
"inputs" : [
"src/**" ,
"tests/**" ,
"*.config.*"
] ,
"env" : [ "CI" , "NODE_ENV" ]
} ,
"test:e2e" : {
"dependsOn" : [ "build" ] ,
"outputs" : [ ] ,
"cache" : false
} ,
"deploy" : {
"dependsOn" : [ "build" , "test" , "lint" ] ,
"outputs" : [ ] ,
"cache" : false
} ,
"db:generate" : {
"cache" : false
} ,
"db:push" : {
"cache" : false ,
"dependsOn" : [ "db:generate" ]
} ,
"@myorg/web#build" : {
"dependsOn" : [ "^build" , "@myorg/db#db:generate" ] ,
"outputs" : [ ".next/**" ] ,
"env" : [ "NEXT_PUBLIC_*" ]
}
}
}
Template 7: Root package.json Setup {
"name" : "my-turborepo" ,
"private" : true ,
"workspaces" : [
"apps/*" ,
"packages/*"
] ,
"scripts" : {
"build" : "turbo build" ,
"dev" : "turbo dev" ,
"lint" : "turbo lint" ,
"test" : "turbo test" ,
"clean" : "turbo clean && rm -rf node_modules" ,
"format" : "prettier --write \"**/*.{ts,tsx,md}\"" ,
"changeset" : "changeset" ,
"version-packages" : "changeset version" ,
"release" : "turbo build --filter=./packages/* && changeset publish"
} ,
"devDependencies" : {
"turbo" : "^1.10.0" ,
"prettier" : "^3.0.0" ,
"@changesets/cli" : "^2.26.0"
} ,
"packageManager" : "npm@10.0.0"
}
Debugging Cache
turbo build --dry-run
turbo build --verbosity=2
turbo build --graph
turbo build --force
turbo build --summarize
TURBO_LOG_VERBOSITY=debug turbo build --filter=@myorg/web
Best Practices
Do's
Define explicit inputs - Avoid cache invalidation
Use workspace protocol - "@myorg/ui": "workspace:*"
Enable remote caching - Share across CI and local
Filter in CI - Build only affected packages
Cache build outputs - Not source files
Don'ts
Don't cache dev servers - Use persistent: true
Don't include secrets in env - Use runtime env vars
Don't ignore dependsOn - Causes race conditions
Don't over-filter - May miss dependencies
Resources
Connections
Domain: [[Software Entwicklung]]
Kategorie: [[Software Architektur]]
Navigation: [[Skills Uebersicht]], [[Home]]