{"id":"turborepo-caching","name":"turborepo-caching","summary":"Turborepoをローカルおよびリモートキャッシュで効率的なモノレポビルドに設定してください。Turborepoの設定、ビルドパイプラインの最適化、分散キャッシュの実装時に利用してください。","body":"# Turborepo Caching\n\nProduction patterns for Turborepo build optimization.\n\n## When to Use This Skill\n\n- Setting up new Turborepo projects\n- Configuring build pipelines\n- Implementing remote caching\n- Optimizing CI/CD performance\n- Migrating from other monorepo tools\n- Debugging cache misses\n\n## Core Concepts\n\n### 1. Turborepo Architecture\n\n```\nWorkspace Root/\n├── apps/\n│   ├── web/\n│   │   └── package.json\n│   └── docs/\n│       └── package.json\n├── packages/\n│   ├── ui/\n│   │   └── package.json\n│   └── config/\n│       └── package.json\n├── turbo.json\n└── package.json\n```\n\n### 2. Pipeline Concepts\n\n| Concept        | Description                      |\n| -------------- | -------------------------------- |\n| **dependsOn**  | Tasks that must complete first   |\n| **cache**      | Whether to cache outputs         |\n| **outputs**    | Files to cache                   |\n| **inputs**     | Files that affect cache key      |\n| **persistent** | Long-running tasks (dev servers) |\n\n## Templates\n\n### Template 1: turbo.json Configuration\n\n```json\n{\n  \"$schema\": \"https://turbo.build/schema.json\",\n  \"globalDependencies\": [\".env\", \".env.local\"],\n  \"globalEnv\": [\"NODE_ENV\", \"VERCEL_URL\"],\n  \"pipeline\": {\n    \"build\": {\n      \"dependsOn\": [\"^build\"],\n      \"outputs\": [\"dist/**\", \".next/**\", \"!.next/cache/**\"],\n      \"env\": [\"API_URL\", \"NEXT_PUBLIC_*\"]\n    },\n    \"test\": {\n      \"dependsOn\": [\"build\"],\n      \"outputs\": [\"coverage/**\"],\n      \"inputs\": [\"src/**/*.tsx\", \"src/**/*.ts\", \"test/**/*.ts\"]\n    },\n    \"lint\": {\n      \"outputs\": [],\n      \"cache\": true\n    },\n    \"typecheck\": {\n      \"dependsOn\": [\"^build\"],\n      \"outputs\": []\n    },\n    \"dev\": {\n      \"cache\": false,\n      \"persistent\": true\n    },\n    \"clean\": {\n      \"cache\": false\n    }\n  }\n}\n```\n\n### Template 2: Package-Specific Pipeline\n\n```json\n// apps/web/turbo.json\n{\n  \"$schema\": \"https://turbo.build/schema.json\",\n  \"extends\": [\"//\"],\n  \"pipeline\": {\n    \"build\": {\n      \"outputs\": [\".next/**\", \"!.next/cache/**\"],\n      \"env\": [\"NEXT_PUBLIC_API_URL\", \"NEXT_PUBLIC_ANALYTICS_ID\"]\n    },\n    \"test\": {\n      \"outputs\": [\"coverage/**\"],\n      \"inputs\": [\"src/**\", \"tests/**\", \"jest.config.js\"]\n    }\n  }\n}\n```\n\n### Template 3: Remote Caching with Vercel\n\n```bash\n# Login to Vercel\nnpx turbo login\n\n# Link to Vercel project\nnpx turbo link\n\n# Run with remote cache\nturbo build --remote-only\n\n# CI environment variables\nTURBO_TOKEN=your-token\nTURBO_TEAM=your-team\n```\n\n```yaml\n# .github/workflows/ci.yml\nname: CI\n\non:\n  push:\n    branches: [main]\n  pull_request:\n\nenv:\n  TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}\n  TURBO_TEAM: ${{ vars.TURBO_TEAM }}\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n\n      - uses: actions/setup-node@v4\n        with:\n          node-version: 20\n          cache: \"npm\"\n\n      - name: Install dependencies\n        run: npm ci\n\n      - name: Build\n        run: npx turbo build --filter='...[origin/main]'\n\n      - name: Test\n        run: npx turbo test --filter='...[origin/main]'\n```\n\n### Template 4: Self-Hosted Remote Cache\n\n```typescript\n// Custom remote cache server (Express)\nimport express from \"express\";\nimport { createReadStream, createWriteStream } from \"fs\";\nimport { mkdir } from \"fs/promises\";\nimport { join } from \"path\";\n\nconst app = express();\nconst CACHE_DIR = \"./cache\";\n\n// Get artifact\napp.get(\"/v8/artifacts/:hash\", async (req, res) => {\n  const { hash } = req.params;\n  const team = req.query.teamId || \"default\";\n  const filePath = join(CACHE_DIR, team, hash);\n\n  try {\n    const stream = createReadStream(filePath);\n    stream.pipe(res);\n  } catch {\n    res.status(404).send(\"Not found\");\n  }\n});\n\n// Put artifact\napp.put(\"/v8/artifacts/:hash\", async (req, res) => {\n  const { hash } = req.params;\n  const team = req.query.teamId || \"default\";\n  const dir = join(CACHE_DIR, team);\n  const filePath = join(dir, hash);\n\n  await mkdir(dir, { recursive: true });\n\n  const stream = createWriteStream(filePath);\n  req.pipe(stream);\n\n  stream.on(\"finish\", () => {\n    res.json({\n      urls: [`${req.protocol}://${req.get(\"host\")}/v8/artifacts/${hash}`],\n    });\n  });\n});\n\n// Check artifact exists\napp.head(\"/v8/artifacts/:hash\", async (req, res) => {\n  const { hash } = req.params;\n  const team = req.query.teamId || \"default\";\n  const filePath = join(CACHE_DIR, team, hash);\n\n  try {\n    await fs.access(filePath);\n    res.status(200).end();\n  } catch {\n    res.status(404).end();\n  }\n});\n\napp.listen(3000);\n```\n\n```json\n// turbo.json for self-hosted cache\n{\n  \"remoteCache\": {\n    \"signature\": false\n  }\n}\n```\n\n```bash\n# Use self-hosted cache\nturbo build --api=\"http://localhost:3000\" --token=\"my-token\" --team=\"my-team\"\n```\n\n### Template 5: Filtering and Scoping\n\n```bash\n# Build specific package\nturbo build --filter=@myorg/web\n\n# Build package and its dependencies\nturbo build --filter=@myorg/web...\n\n# Build package and its dependents\nturbo build --filter=...@myorg/ui\n\n# Build changed packages since main\nturbo build --filter='...[origin/main]'\n\n# Build packages in directory\nturbo build --filter='./apps/*'\n\n# Combine filters\nturbo build --filter=@myorg/web --filter=@myorg/docs\n\n# Exclude package\nturbo build --filter='!@myorg/docs'\n\n# Include dependencies of changed\nturbo build --filter='...[HEAD^1]...'\n```\n\n### Template 6: Advanced Pipeline Configuration\n\n```json\n{\n  \"$schema\": \"https://turbo.build/schema.json\",\n  \"pipeline\": {\n    \"build\": {\n      \"dependsOn\": [\"^build\"],\n      \"outputs\": [\"dist/**\"],\n      \"inputs\": [\"$TURBO_DEFAULT$\", \"!**/*.md\", \"!**/*.test.*\"]\n    },\n    \"test\": {\n      \"dependsOn\": [\"^build\"],\n      \"outputs\": [\"coverage/**\"],\n      \"inputs\": [\"src/**\", \"tests/**\", \"*.config.*\"],\n      \"env\": [\"CI\", \"NODE_ENV\"]\n    },\n    \"test:e2e\": {\n      \"dependsOn\": [\"build\"],\n      \"outputs\": [],\n      \"cache\": false\n    },\n    \"deploy\": {\n      \"dependsOn\": [\"build\", \"test\", \"lint\"],\n      \"outputs\": [],\n      \"cache\": false\n    },\n    \"db:generate\": {\n      \"cache\": false\n    },\n    \"db:push\": {\n      \"cache\": false,\n      \"dependsOn\": [\"db:generate\"]\n    },\n    \"@myorg/web#build\": {\n      \"dependsOn\": [\"^build\", \"@myorg/db#db:generate\"],\n      \"outputs\": [\".next/**\"],\n      \"env\": [\"NEXT_PUBLIC_*\"]\n    }\n  }\n}\n```\n\n### Template 7: Root package.json Setup\n\n```json\n{\n  \"name\": \"my-turborepo\",\n  \"private\": true,\n  \"workspaces\": [\"apps/*\", \"packages/*\"],\n  \"scripts\": {\n    \"build\": \"turbo build\",\n    \"dev\": \"turbo dev\",\n    \"lint\": \"turbo lint\",\n    \"test\": \"turbo test\",\n    \"clean\": \"turbo clean && rm -rf node_modules\",\n    \"format\": \"prettier --write \\\"**/*.{ts,tsx,md}\\\"\",\n    \"changeset\": \"changeset\",\n    \"version-packages\": \"changeset version\",\n    \"release\": \"turbo build --filter=./packages/* && changeset publish\"\n  },\n  \"devDependencies\": {\n    \"turbo\": \"^1.10.0\",\n    \"prettier\": \"^3.0.0\",\n    \"@changesets/cli\": \"^2.26.0\"\n  },\n  \"packageManager\": \"npm@10.0.0\"\n}\n```\n\n## Debugging Cache\n\n```bash\n# Dry run to see what would run\nturbo build --dry-run\n\n# Verbose output with hashes\nturbo build --verbosity=2\n\n# Show task graph\nturbo build --graph\n\n# Force no cache\nturbo build --force\n\n# Show cache status\nturbo build --summarize\n\n# Debug specific task\nTURBO_LOG_VERBOSITY=debug turbo build --filter=@myorg/web\n```\n\n## Best Practices\n\n### Do's\n\n- **Define explicit inputs** - Avoid cache invalidation\n- **Use workspace protocol** - `\"@myorg/ui\": \"workspace:*\"`\n- **Enable remote caching** - Share across CI and local\n- **Filter in CI** - Build only affected packages\n- **Cache build outputs** - Not source files\n\n### Don'ts\n\n- **Don't cache dev servers** - Use `persistent: true`\n- **Don't include secrets in env** - Use runtime env vars\n- **Don't ignore dependsOn** - Causes race conditions\n- **Don't over-filter** - May miss dependencies","author":"@wshobson","ownerProfile":null,"authorContacts":null,"sourceUrl":"https://github.com/wshobson/agents/tree/main/plugins/developer-essentials/skills/turborepo-caching","license":"MIT","category":"document","lang":"en","tokens":2209,"stars":0,"calls30d":2,"claimed":false,"visibility":"public","origin":"crawler","version":"0.1.0","createdAt":"2026-08-22","updatedAt":"2026-08-22","files":[],"requires":{"mcp":[],"tools":[]},"safety":{"flags":[],"scannedAt":"2026-08-22","hasScripts":false,"networkEndpoints":["turbo.build"]}}