Monorepo Tooling

Turborepo

Turborepo ist ein hochperformantes Build-System für JavaScript Monorepos. Es führt Tasks über verschiedene Packages hinweg aus, cached die Ergebnisse und überspringt alles, was sich nicht geändert hat.

advanced13 min readUpdated 15. Sept. 2026
turbo.json
json
// turbo.json
{
  "$schema": "https://turbo.build/schema.json",
  "tasks": {
    "build": {
      "dependsOn": ["^build"],
      "outputs": ["dist/**"]
    },
    "test": {
      "dependsOn": ["build"]
    },
    "dev": {
      "cache": false,
      "persistent": true
    }
  }
}
Gewartet von
Vercel
Funktioniert mit
npm, pnpm, yarn, bun
Konfiguration
turbo.json
Caching
Lokal und remote
Pipeline
dependsOn
Sprache
Geschrieben in Rust

Warum es wichtig ist

Warum Monorepos ein Build-System benötigen

Niemals dasselbe zweimal bauen

Tasks werden anhand ihrer Inputs gehasht. Unveränderte Arbeit wird aus dem Cache wiederhergestellt, anstatt erneut ausgeführt zu werden.

Parallel und geordnet

Unabhängige Tasks laufen parallel, während die Pipeline die Reihenfolge erzwingt, die von den Abhängigkeiten gefordert wird.

Für Monorepos gebaut

Führe einen Befehl über jedes Package aus, filtere nach Änderungen und teile einen einzigen Cache innerhalb des Teams.

Das Gesamtbild

Die drei Grundideen hinter Turborepo

Eine Task-Pipeline, Content-basiertes Hashing und ein Cache, der unveränderte Arbeit „kostenlos“ macht.

Die Pipeline

Ordnung

Ein deklarativer Graph von Tasks und deren Abhängigkeiten, definiert in der turbo.json.

Content-basiertes Hashing

Identifikation

Die Inputs jedes Tasks werden zu einem Key gehasht, der entscheidet, ob die Arbeit erneut ausgeführt werden muss.

Der Cache

Geschwindigkeit

Task-Outputs werden über diesen Hash gespeichert und wiederhergestellt, lokal oder in einem gemeinsamen Remote-Cache.

Turborepo auf einen Blick

Der Kern von Turborepo

turbo.json

Definiert Tasks, deren Abhängigkeiten und deren Outputs.

dependsOn

Steuert die Reihenfolge, z. B. das Bauen von Abhängigkeiten vor den Packages, die diese nutzen.

Hashing

Inputs werden gehasht, sodass ein Task nur dann erneut läuft, wenn sich etwas Relevantes ändert.

Caching

Speichert Outputs und Logs und stellt sie beim nächsten Durchlauf wieder her.

Remote Cache

Teilt gecachte Ergebnisse über verschiedene Maschinen und die CI hinweg.

Filtering

Führt Tasks nur für Packages aus, die von einer Änderung betroffen sind.

Eine kurze Geschichte

Vom internen Tool zum Monorepo-Standard

  1. 2021

    Turborepo veröffentlicht

    Jared Palmer stellt ein schnelles Build-System für JavaScript Monorepos vor.

    21
  2. 2022

    Übernahme durch Vercel

    Die Entwicklung beschleunigt sich mit Fokus auf Remote Caching und CI.

    22
  3. 2023

    Turborepo 1.10 und 2.0

    Eine in Rust neu geschriebene Engine und ein neues Format für die Task-Konfiguration erscheinen.

    23
  4. 2024

    Remote Caching reift aus

    Shared Caching über Teams und CI hinweg wird zu einem zentralen Workflow.

    24
  5. Heute

    Der Monorepo-Standard

    Eine gängige Wahl zusammen mit pnpm Workspaces für große Repositories.

    Heute

Der vollständige Leitfaden

Turborepo: Alles was Sie wissen müssen

Was ist Turborepo?

Turborepo ist ein hochperformantes Build-System für JavaScript Monorepos. Es führt Tasks über alle Packages in deinem Repository hinweg aus, berücksichtigt dabei die Abhängigkeiten zwischen ihnen und cached die Ergebnisse, sodass unveränderte Arbeit niemals wiederholt wird.

Ein Monorepo ohne Build-System wird schnell mühsam. build und test manuell in jedem Package auszuführen ist langsam, und ein naives Script führt alles erneut aus, selbst wenn sich nur ein einziges Package geändert hat. Turborepo löst beides: Eine deklarative Task-Pipeline übernimmt die Reihenfolge, und Content-basiertes Hashing sorgt dafür, dass unveränderte Tasks effektiv kostenlos sind.

Die Task-Pipeline

Die Pipeline befindet sich in turbo.json. Jeder Task deklariert seine Abhängigkeiten und Outputs.

{
  "$schema": "https://turbo.build/schema.json",
  "tasks": {
    "build": {
      "dependsOn": ["^build"],
      "outputs": ["dist/**", ".next/**"]
    },
    "test": {
      "dependsOn": ["build"],
      "outputs": ["coverage/**"]
    },
    "lint": {},
    "dev": {
      "cache": false,
      "persistent": true
    }
  }
}

dependsOn mit einem Caret (^build) bedeutet „baue zuerst meine Abhängigkeiten“. Ohne das Caret bezieht es sich auf einen Task innerhalb desselben Packages. outputs teilt Turborepo mit, was gecached werden soll, und cache: false schließt einen Task wie dev aus, da dieser endlos läuft.

Tasks ausführen

Ein einziger Befehl führt einen Task über das gesamte Repository hinweg aus – in der richtigen Reihenfolge und, wo möglich, parallel.

turbo run build
turbo run test lint
turbo run dev --filter=web

Turborepo erstellt einen Graph aus dependsOn, führt unabhängige Tasks gleichzeitig aus und stellt abhängige Tasks in eine Warteschlange. Das Ergebnis ist der schnellstmögliche Zeitplan, der dennoch die Abhängigkeiten zwischen den Packages berücksichtigt.

Caching

Caching ist das Feature, das das Gefühl bei der Arbeit mit einem Monorepo grundlegend verändert. Für jeden Task erstellt Turborepo einen Hash der Inputs – Quelldateien, Abhängigkeiten, Umgebungsvariablen und Konfigurationen – und speichert die Outputs sowie die Logs unter diesem Hash.

Beim nächsten Durchlauf wird der Task übersprungen und seine Outputs aus dem Cache wiederhergestellt, sofern sich der Hash nicht geändert hat. Auch die Logs werden erneut ausgegeben, sodass das Ergebnis identisch aussieht, ohne dass die Arbeit erneut erledigt werden muss. Bei einem warmen Cache kann ein vollständiger turbo run build über Dutzende von Packages in wenigen Sekunden abgeschlossen sein.

Remote Caching

Ein lokaler Cache hilft nur einer einzelnen Maschine. Remote Caching teilt den Cache innerhalb des Teams und der CI.

  • Ein Entwickler baut ein Paket; das Ergebnis wird hochgeladen.
  • Ein anderer Entwickler checkt denselben Commit aus und stellt das Ergebnis sofort wieder her.
  • Die CI stellt dieselben Artefakte wieder her und überspringt so Arbeit, die bereits an anderer Stelle erledigt wurde.

Dadurch wird der Cache zu einem gemeinsamen Asset, was oft den größten Geschwindigkeitsvorteil für die CI in einem Monorepo darstellt. Vercel bietet einen gehosteten Remote Cache an, und für Teams, die dies benötigen, gibt es auch Self-Hosted-Optionen.

Filtern

In großen Monorepos muss selten jeder Task ausgeführt werden. Durch Filtern wird eine Teilmenge von Packages angesprochen.

# only packages affected by changes since main
turbo run test --filter="...[origin/main]"

# one package and its dependencies
turbo run build --filter=web...

# only packages that depend on @repo/ui
turbo run build --filter=...@repo/ui

Die [origin/main]-Syntax weist Turborepo an, zu berechnen, welche Packages geändert wurden, und deren Abhängige einzubeziehen. In der CI bedeutet dies, dass ein Pull Request, der nur ein Package betrifft, nur das baut und testet, was tatsächlich davon beeinflusst wird.

Workspaces und Struktur

Turborepo verwaltet Abhängigkeiten nicht selbst – das ist die Aufgabe des Package Managers. Sie definieren Workspaces mit pnpm, npm, yarn oder bun, und Turborepo setzt die Pipeline und den Cache darauf auf.

repo/
├── apps/
│   ├── web/          # a deployable app
│   └── docs/
├── packages/
│   ├── ui/           # a shared component library
│   └── config/       # shared config
├── package.json
├── pnpm-workspace.yaml
└── turbo.json

Apps nutzen gemeinsam verwendete Packages über das Workspace-Protokoll, und Turborepo versteht diesen Dependency Graph bei der Planung der Tasks. Die Kombination aus pnpm Workspaces für das Linking und Turborepo für die Task-Ausführung ist das gängigste moderne Monorepo-Setup.

Best Practices

  • Deklariere outputs für jede cachebare Aufgabe.
  • Nutze dependsOn zusammen mit ^, um die Abhängigkeitsreihenfolge festzulegen.
  • Markiere langlaufende Aufgaben wie dev mit cache: false.
  • Aktiviere Remote Caching in der CI, um die größten Performance-Gewinne zu erzielen.
  • Filtere in der CI nach geänderten Packages, um die Pipelines schnell zu halten.
  • Behalte turbo.json im Repository-Root und teile es über alle Packages hinweg.
  • Füge ein Root-Script hinzu, damit das gesamte Team dieselben Befehle ausführt.

Häufige Fehler

  • Das Vergessen von outputs, wodurch der Cache-Vorteil verloren geht.
  • Das Ausführen von Tasks in einer beliebigen Reihenfolge, anstatt dependsOn zu verwenden.
  • Das Caching von persistenten Tasks, wie zum Beispiel einem Dev-Server.
  • Das unnötige Aufnehmen von volatilen Umgebungsvariablen in den Hash.
  • Das Ausführen der vollständigen Pipeline in der CI, obwohl ein Filter nicht betroffene Packages überspringen würde.
  • Die Behandlung von Turborepo als Ersatz für einen Package-Manager.

Wie geht es weiter?

Turborepo verwandelt ein Monorepo von einer Last in einen Vorteil. Kombiniere es mit pnpm für das Workspace-Linking, verstehe die Grundlagen von npm und Node.js und nutze Vite, um die einzelnen Packages zu builden. Füge anschließend eine root turbo run build zu einem Repository mit mehr als einem Package hinzu und erlebe, wie der zweite Durchlauf fast augenblicklich abgeschlossen ist.

Konfiguration eines Tasks

Deklariere Outputs, damit Turborepo sie cachen und wiederherstellen kann. Ohne Outputs wird der Task jedes Mal neu ausgeführt.

Bevorzugt
{
  "tasks": {
    "build": {
      "dependsOn": ["^build"],
      "outputs": ["dist/**", ".next/**"]
    }
  }
}
Vermeiden
{
  "tasks": {
    "build": {}
    // nothing cached,
    // every run rebuilds
  }
}

Reihenfolge der Arbeit

dependsOn baut Abhängigkeiten zuerst. Das Ausführen von Tasks in einer beliebigen Reihenfolge führt zu Fehlern durch fehlende Artefakte.

Bevorzugt
{
  "tasks": {
    "build": {
      "dependsOn": ["^build"]
    }
  }
}
Vermeiden
# hoping the packages
# happen to build in the
# right order

Häufig gestellte Fragen

Häufig gestellte Fragen

Keep learning

Related topics from the roadmap.

$ Lernen Sie jetzt

Bereit, Turborepo zu lernen?

Unser interaktives Tutorial führt Sie Schritt für Schritt durch Turborepo — mit Quizzen und echtem Code, den Sie im Browser ausführen können.