Når man arbejder med komplekse softwareprojekter, kan valget mellem monorepo og polyrepo have stor indflydelse på dit teams produktivitet og kodens skalerbarhed. I denne artikel analyserer vi forskellene, fordele og ulemper ved hver tilgang og hjælper dig med at forstå, hvilken der er den rette for dig.
Hvad er Monorepo og Polyrepo?
Monorepo
Et monorepo (monolitisk repository) er et enkelt repository, der indeholder kildekoden til flere projekter, tjenester eller pakker, ofte relateret til hinanden.
my-monorepo/ packages/ frontend/ backend/ shared/ package.json turbo.json
Polyrepo
Et polyrepo (flere repositories) betyder, at hvert projekt, tjeneste eller pakke har sit eget separate repository.
repos/ frontend/ package.json backend/ package.json shared/ package.json
Visuel forskel
Fordele og ulemper
Monorepo
Fordele:
- Gør kodedeling nemmere (f.eks. delte biblioteker).
- Atomisk refaktorering på tværs af flere projekter.
- Centraliseret håndtering af afhængigheder og konfigurationer.
Ulemper:
- Kan blive tungt, når kodebasen vokser.
- Kræver værktøjer til at håndtere delvise builds/tests (f.eks. Nx, Turborepo).
Polyrepo
Fordele:
- Hvert team/projekt er uafhængigt.
- Nemmere at håndtere for små projekter.
- Muliggør granulære adgangspolitikker.
Ulemper:
- Sværere at dele kode uden at publicere pakker.
- Refaktorering på tværs af repos er mere kompleks.
- Mulig duplikering af konfigurationer.
Praktisk eksempel: Monorepo med Turborepo
Antag, at du vil oprette et monorepo med frontend og backend ved hjælp af Turborepo.
1. Initialiser monorepoet
npx create-turbo@latest
2. Typisk struktur
my-monorepo/ apps/ web/ # frontend Next.js api/ # backend Node.js/Express packages/ ui/ # delt komponentbibliotek utils/ # delte funktioner turbo.json package.json
3. Eksempel på workspace i package.json
{ "private": true, "workspaces": [ "apps/*", "packages/*" ] }
4. Eksempel på import af et delt bibliotek
Antag, at du har en funktion i packages/utils/src/formatDate.ts:
// packages/utils/src/formatDate.ts export function formatDate(date: Date): string { return date.toLocaleDateString('en-US'); }
I frontend:
// apps/web/pages/index.tsx import { formatDate } from '@myorg/utils'; export default function Home() { return <div>I dag er det {formatDate(new Date())}</div>; }
Hvornår skal man vælge Monorepo?
- Mellemstore til store teams, der arbejder på flere relaterede projekter.
- Behov for at dele kode og udføre refaktorering i stor skala.
- Projekter, der vokser hurtigt og kræver optimerede builds/tests.
Hvornår skal man vælge Polyrepo?
- Små eller uafhængige projekter.
- Separate teams, der arbejder på forskellige produkter.
- Meget restriktive adgangspolitikker.
Konklusion
Der er ingen perfekt løsning for alle. Valget afhænger af teamstørrelse, projektets kompleksitet og samarbejdsbehov. Det vigtige er at være bevidst om afvejningerne og vælge de rette værktøjer til at håndtere kompleksiteten.