Configura l’ambiente di Devin per monorepo, workspace multi-package e progetti con sottodirectory indipendenti.
I monorepo e i workspace multi-package richiedono particolare attenzione nei blueprint, perché sottodirectory diverse possono usare linguaggi, gestori di pacchetti o set di dipendenze differenti. Devin supporta due approcci:
Workspace nativi (consigliato)
Crea un blueprint separato per ogni sottodirectory. Ogni workspace ha le proprie sezioni initialize, maintenance e Knowledge, con la directory di lavoro impostata automaticamente sulla sottodirectory corrispondente.
Subshells
Esegui i comandi nelle sottodirectory all’interno di un singolo blueprint usando (cd dir && command). È più semplice per monorepo di piccole dimensioni con pochi package.
Consigliati per la maggior parte dei monorepo. I workspace nativi forniscono a ogni sottodirectory il proprio blueprint, con setup, Knowledge e directory di lavoro isolati. Questa soluzione è più ordinata e più facile da mantenere rispetto ai subshells, man mano che aumenta il numero di package.
Con i workspace nativi, ogni sottodirectory ha un blueprint dedicato. I comandi in quel blueprint vengono eseguiti con la directory di lavoro già impostata sulla sottodirectory, senza bisogno di cd o di subshells.
Ogni repo che usa workspace native deve avere un blueprint radice. Il blueprint radice viene eseguito dalla radice del repository prima di qualsiasi blueprint con ambito workspace. Usalo per la configurazione condivisa valida per l’intero repo — ad esempio per installare runtime, strumenti globali o le dipendenze a livello della radice.
# blueprint radice — viene eseguito per primo, dalla root del repoinitialize: | npm install -g pnpmmaintenance: | pnpm install
I blueprint del workspace gestiscono quindi la configurazione specifica del package e vengono eseguiti una volta completato il blueprint radice.
Inserisci il percorso della sottodirectory (ad es. packages/frontend)
Scrivi il blueprint per quel workspace
Il percorso del workspace deve corrispondere a una directory reale all’interno del repository. Se il percorso non esiste quando viene eseguita la build, la build fallirà. Verifica attentamente che il percorso corrisponda esattamente alla struttura del tuo repo (ad es. packages/frontend, non pkg/frontend).
Un monorepo con un frontend React e un backend Python. Il blueprint radice installa gli strumenti condivisi, poi ogni workspace gestisce le proprie dipendenze:
# Workspace nell'ambito di packages/frontendmaintenance: | pnpm installknowledge: - name: lint contents: pnpm lint - name: test contents: pnpm test - name: dev contents: pnpm dev
# Workspace nell'ambito di 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
Le voci knowledge di ciascun workspace sono limitate a quella sottodirectory. Quando Devin lavora in packages/frontend, vede i comandi lint/test/dev del frontend, non quelli del backend.
Per i monorepo più semplici, puoi gestire tutto all’interno di un unico blueprint tramite subshell. Racchiudi i comandi tra parentesi per eseguirli in una sottodirectory senza influire sui passaggi successivi:
Le parentesi (cd ... && ...) creano una subshell. Quando la subshell termina, la directory di lavoro torna alla radice della repo per il passaggio successivo.
Senza parentesi, cd cambia la directory di lavoro per tutti i passaggi successivi. Usa sempre le subshell quando cambi directory nei passaggi di Blueprint.
Il primo passaggio cambia la directory di lavoro in packages/frontend. Il secondo passaggio cerca quindi di eseguire cd packages/backend partendo da packages/frontend, quindi fallisce.
Che tu usi workspace nativi o subshell, delle voci di Knowledge ben strutturate aiutano Devin a orientarsi nel codebase:
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
Una voce di Knowledge structure che associa ogni directory al relativo linguaggio e alla relativa toolchain aiuta Devin a orientarsi rapidamente nel repo. Con i workspace nativi, ogni workspace ha le proprie voci di Knowledge, quindi la voce structure è particolarmente utile nel blueprint di root o per configurazioni basate su subshell.
Per i workspace gestiti da uno strumento di build monorepo come Turborepo o Nx, installa le dipendenze alla radice e lascia che lo strumento gestisca l’orchestrazione dei singoli pacchetti:
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
Preferisci workspace nativi per i monorepo complessi
Quando ogni sottodirectory ha il proprio linguaggio, gestore di pacchetti o processo di build, i workspace nativi mantengono ogni blueprint focalizzato e indipendente. Riserva le subshell ai casi semplici con pochi pacchetti.
Usa sempre le subshell per i cambi di directory
Quando usi l’approccio basato su subshell, racchiudi i comandi cd tra parentesi: (cd dir && command). Questo impedisce che il cambio di directory di un passaggio influisca su quello successivo.
Metti gli strumenti condivisi nel blueprint dell'org
I runtime dei linguaggi e i gestori di pacchetti usati in più repo appartengono al blueprint per tutta l’org. Questo evita duplicazioni e mantiene i blueprint delle repo focalizzati sulla configurazione specifica del progetto.
Ordina i passaggi di maintenance in base alle dipendenze
Se il pacchetto A dipende dal fatto che il pacchetto B venga compilato per primo, elenca il passaggio di build di B prima del passaggio di installazione di A in maintenance. I passaggi del blueprint vengono eseguiti in sequenza nell’ordine indicato.
Aggiungi una voce di Knowledge sulla struttura
Una voce di Knowledge chiamata structure, che associa le directory ai rispettivi linguaggi e strumenti, aiuta Devin a orientarsi nella codebase. Includi quale gestore di pacchetti usa ogni sottodirectory ed eventuali dipendenze tra pacchetti.
Usa voci di Knowledge per pacchetto
Invece di un’unica grande voce di Knowledge, crea voci separate per ogni pacchetto (ad es. frontend, backend, ml-pipeline). Con i workspace nativi, ogni workspace include già la propria sezione Knowledge.
Mantieni incrementale la sezione maintenance
Usa pnpm install (non pnpm install --force) e uv sync (non rm -rf .venv && uv sync). I comandi incrementali sono più veloci durante le ricostruzioni periodiche.