Konfigurieren Sie Devins Umgebung für Monorepos, Workspaces mit mehreren Paketen und Projekte mit unabhängigen Unterverzeichnissen.
Monorepos und Workspaces mit mehreren Paketen erfordern bei Blueprints besondere Sorgfalt, da in verschiedenen Unterverzeichnissen unterschiedliche Sprachen, Paketmanager oder Abhängigkeiten verwendet werden können. Devin unterstützt zwei Ansätze:
Native Workspaces (empfohlen)
Erstellen Sie für jedes Unterverzeichnis einen separaten Blueprint. Jeder Workspace erhält eigene Abschnitte für initialize und Maintenance, wobei das Arbeitsverzeichnis automatisch auf das jeweilige Unterverzeichnis gesetzt wird.
Subshells
Führen Sie Befehle in Unterverzeichnissen innerhalb eines einzelnen Blueprints mit (cd dir && command) aus. Einfacher für kleine Monorepos mit nur wenigen Paketen.
Für die meisten Monorepos empfohlen. Native Workspaces geben jedem Unterverzeichnis einen eigenen Blueprint mit isoliertem Setup und Arbeitsverzeichnis. Das ist übersichtlicher und leichter zu warten als subshells, wenn die Anzahl der Packages wächst.
Bei Native Workspaces erhält jedes Unterverzeichnis einen dedizierten Blueprint. Befehle in diesem Blueprint werden ausgeführt, wobei das Arbeitsverzeichnis bereits auf das Unterverzeichnis gesetzt ist — cd oder subshells sind nicht nötig.
Jedes Repo, das native Workspaces verwendet, sollte ein Root-Blueprint haben. Der Root-Blueprint wird im Root-Verzeichnis des Repo ausgeführt, und zwar vor allen Workspace-spezifischen Blueprints. Verwenden Sie ihn für gemeinsames Setup, das im gesamten Repo gilt — etwa zum Installieren von Runtimes, globalen Tools oder zum Ausführen von Abhängigkeitsinstallationen im Root-Verzeichnis.
# Root-Blueprint — wird zuerst ausgeführt, vom Repo-Root ausinitialize: | npm install -g pnpmmaintenance: | pnpm install
Workspace-Blueprints übernehmen dann das paketspezifische Setup und werden nach Abschluss des Root-Blueprints ausgeführt.
Geben Sie den Pfad des Unterverzeichnisses ein (z. B. packages/frontend)
Erstellen Sie das Blueprint für diesen Workspace
Der Workspace-Pfad muss einem tatsächlichen Verzeichnis innerhalb des Repositorys entsprechen. Wenn der Pfad beim Ausführen des Builds nicht existiert, schlägt der Build fehl. Prüfen Sie sorgfältig, dass der Pfad exakt mit Ihrer Repo-Struktur übereinstimmt (z. B. packages/frontend, nicht pkg/frontend).
Ein Monorepo mit einem React-Frontend und einem Python-Backend. Im Root-Blueprint werden gemeinsam genutzte Tools installiert, anschließend verwaltet jeder Workspace seine eigenen Abhängigkeiten:
Root
packages/frontend
packages/backend
# Root-Blueprint — gemeinsames Setup für das gesamte Repoinitialize: | npm install -g pnpm curl -LsSf https://astral.sh/uv/install.sh | shknowledge: - name: structure contents: | Monorepo mit zwei Packages: - packages/frontend — React-App (TypeScript, pnpm) - packages/backend — Python-API (FastAPI, uv)
# Workspace mit Geltungsbereich packages/frontendmaintenance: | pnpm installknowledge: - name: lint contents: pnpm lint - name: test contents: pnpm test - name: dev contents: pnpm dev
# Workspace mit Geltungsbereich packages/backendmaintenance: | uv syncknowledge: - name: lint contents: uv run ruff check . - name: test contents: uv run pytest - name: dev contents: uv run uvicorn app.main:app --reload
Die knowledge-Einträge jedes Workspaces sind auf dieses Unterverzeichnis beschränkt. Wenn Devin in packages/frontend arbeitet, sieht es die Frontend-Befehle für Linting, Tests und Entwicklung — nicht die für das Backend.
Bei einfacheren Monorepos können Sie alles in einem einzigen Blueprint mithilfe von Subshells verwalten. Schließen Sie Befehle in Klammern ein, um sie in einem Unterverzeichnis auszuführen, ohne dass sich dies auf nachfolgende Schritte auswirkt:
Die Klammern (cd ... && ...) erzeugen eine Subshell. Wenn die Subshell beendet wird, wird das Arbeitsverzeichnis für den nächsten Schritt wieder auf das Stammverzeichnis des Repos gesetzt.
Ohne Klammern ändert cd das Arbeitsverzeichnis für alle folgenden Schritte. Verwende beim Wechseln von Verzeichnissen in Blueprint-Schritten immer Subshells.
Im ersten Schritt wird in das Arbeitsverzeichnis packages/frontend gewechselt. Im zweiten Schritt wird dann versucht, cd packages/backend relativ zu packages/frontend auszuführen, was fehlschlägt.
Unabhängig davon, ob Sie native Workspaces oder Subshells nutzen – gut strukturierte Knowledge-Einträge helfen Devin dabei, sich in der Codebasis zurechtzufinden:
knowledge: - name: structure contents: | This is a monorepo with three packages: - `packages/frontend` — React app (TypeScript, pnpm) - `packages/backend` — Python API (FastAPI, uv) - `packages/shared` — Shared TypeScript utilities - name: frontend contents: | cd packages/frontend Dev server: pnpm dev Lint: pnpm lint Test: pnpm test - name: backend contents: | cd packages/backend Dev server: uv run uvicorn app.main:app --reload Lint: uv run ruff check . Test: uv run pytest
Ein structure-Knowledge-Eintrag, der jedem Verzeichnis seine Sprache und Toolchain zuordnet, hilft Devin, sich schnell im Repo zurechtzufinden. Bei nativen Workspaces hat jeder Workspace seine eigenen Knowledge-Einträge, sodass der Eintrag structure im Root-Blueprint oder bei subshell-basierten Setups am nützlichsten ist.
Für Workspaces, die mit einem Monorepo-Build-Tool wie Turborepo oder Nx verwaltet werden, installieren Sie die Abhängigkeiten im Stammverzeichnis, und lassen Sie das Tool die Orchestrierung für die einzelnen Packages übernehmen:
initialize: | npm install -g pnpm turbomaintenance: | pnpm installknowledge: - name: structure contents: | Turborepo monorepo. Use `turbo` for building and testing: - `apps/web` — Next.js app - `apps/api` — Express API - `packages/ui` — Shared component library - `packages/config` — Shared configuration - name: build contents: turbo run build - name: test contents: turbo run test - name: lint contents: turbo run lint - name: dev contents: turbo run dev
Native Workspaces für komplexe Monorepos bevorzugen
Wenn jedes Unterverzeichnis eine eigene Sprache, einen eigenen Paketmanager oder einen eigenen Build-Prozess hat, bleibt mit nativen Workspaces jedes Blueprint fokussiert und unabhängig. Subshells solltest du einfachen Fällen mit wenigen Paketen vorbehalten.
Für Verzeichniswechsel immer Subshells verwenden
Wenn du den Subshell-Ansatz verwendest, setze cd-Befehle in Klammern: (cd dir && command). So verhinderst du, dass sich der Verzeichniswechsel eines Schritts auf den nächsten auswirkt.
Gemeinsam genutzte Tools im Organisations-Blueprint ablegen
Sprachlaufzeitumgebungen und Paketmanager, die in mehreren Repo verwendet werden, gehören in das organisationsweite Blueprint. So vermeidest du Duplikate und hältst Repo-Blueprints auf das projektspezifische Setup fokussiert.
Maintenance-Schritte nach Abhängigkeiten anordnen
Wenn Paket A davon abhängt, dass Paket B zuerst gebaut wird, führe den Build-Schritt von B in maintenance vor dem Installationsschritt von A auf. Blueprint-Schritte werden in der angegebenen Reihenfolge nacheinander ausgeführt.
Einen Eintrag für die Struktur hinzufügen
Ein Eintrag mit dem Namen structure, der Verzeichnisse ihren Sprachen und Tools zuordnet, hilft Devin, sich in der Codebase zurechtzufinden. Gib an, welchen Paketmanager jedes Unterverzeichnis verwendet und welche paketübergreifenden Abhängigkeiten es gibt.
Einträge pro Paket verwenden
Erstelle statt eines großen Eintrags separate Einträge für jedes Paket (z. B. frontend, backend, ml-pipeline). Bei nativen Workspaces hat jeder Workspace bereits einen integrierten eigenen Bereich.
Maintenance inkrementell halten
Verwende pnpm install (nicht pnpm install --force) und uv sync (nicht rm -rf .venv && uv sync). Inkrementelle Befehle sind bei regelmäßigen Rebuilds schneller.