Takémono repo, single repositoryPokročilý
Definice
Monorepo je strategie správy zdrojového kódu, kdy více aplikací, knihoven nebo služeb žije v jednom verzovaném repozitáři. Tým tím získává společnou historii, snadnější koordinaci změn a sdílené nástroje, ale potřebuje promyšlené hranice balíčků, vlastnictví kódu, rychlé buildy a CI, které nespouští zbytečnou práci.
Proč týmy drží více projektů v jednom repozitáři
Monorepo dává týmu společnou historii změn pro aplikace, knihovny, konfigurace i interní nástroje. Důležitá úprava se nemusí rozpadnout do několika pull requestů v různých repozitářích. Vývojář vidí, které části systému se mění současně, a reviewer může lépe posoudit dopad změny na celý produkt.
Hodnota roste hlavně tam, kde části systému sdílejí typy, komponenty, testovací utilitky, CI šablony nebo release pravidla. Monorepo také usnadňuje refactoring napříč balíčky, protože staré i nové použití se dají opravit najednou. Samotný jeden repozitář ale nezaručuje pořádek. Bez pravidel se společné místo rychle změní v těžko čitelný sklad.
Hranice balíčků neurčuje samotný Git
Git ukládá obsah, historii a větve, nikoli architekturu organizace. Monorepo proto potřebuje jasné názvy adresářů, vlastnictví kódu, pravidla pro závislosti a rozhodnutí, které části se verzují společně. V JavaScriptovém nebo TypeScriptovém projektu se často používají workspaces, v rozsáhlejších systémech pak nástroj, který zná graf závislostí a umí spustit jen relevantní buildy a testy.
Adresářová struktura bývá záměrně předvídatelná. Aplikace mohou být v apps/, sdílené balíčky v packages/ a infrastruktura v infra/. Důležitější než názvy složek je pravidlo, kdo smí na koho záviset. Bez takového pravidla se zrychlení práce snadno zaplatí nechtěným provázáním modulů.
Dva praktické scénáře
Webová aplikace se sdíleným design systémem
Tým provozuje frontend obchodu, administraci a knihovnu komponent. Úprava tlačítka v knihovně proběhne ve stejném pull requestu jako změna obrazovky, která komponentu používá. CI spustí testy jen pro dotčené balíčky, takže změna nezdržuje celý repozitář.
apps/shop
apps/admin
packages/ui
packages/eslint-configBackend rozdělený na služby
Platformní tým udržuje několik API služeb a sdílený klient pro databázi. Přidání pole do interního kontraktu se zapíše jedním commitem do služby i klientské knihovny. Nasazení přesto může zůstat oddělené, protože monorepo neurčuje runtime architekturu.
Co monorepo stojí při každodenní práci
Největší náklady vznikají v nástrojích kolem repozitáře. Velký strom souborů může zpomalit lokální práci, code search, instalaci závislostí i CI. Týmy proto zavádějí build cache, selektivní testování, omezené checkouty, pravidla vlastníků a automatické kontroly závislostí.
Monorepo není automatická volba pro všechny týmy. Strategie dává smysl, když se části systému vyvíjejí společně a sdílení změn je častější než potřeba izolace. Samostatné repozitáře mohou být lepší tam, kde projekty nemají společný release rytmus, mají jiné bezpečnostní požadavky nebo patří odděleným organizacím.
Příklady z praxe
Webová aplikace se sdíleným design systémem
Tým provozuje frontend obchodu, administraci a knihovnu komponent ve stejném repozitáři. Úprava tlačítka v knihovně proběhne ve stejném pull requestu jako změna obrazovky, která komponentu používá. CI spustí testy jen pro dotčené balíčky, takže změna nezdržuje celý repozitář.
apps/shop apps/admin packages/ui packages/eslint-configBackend rozdělený na služby
Platformní tým udržuje několik API služeb a sdílený klient pro databázi. Přidání pole do interního kontraktu se zapíše jedním commitem do služby i klientské knihovny. Nasazení přesto může zůstat oddělené, protože monorepo neurčuje runtime architekturu.
Časté omyly
- MýtusMonorepo znamená, že se všechno nasazuje najednou.
- Ve skutečnostiMonorepo spojuje zdrojový kód a historii, ne nutně release proces. Jednotlivé aplikace nebo služby mohou mít samostatné buildy, testy i nasazení.
- MýtusMonorepo je jen velká složka bez architektury.
- Ve skutečnostiMonorepo bez pravidel opravdu snadno zdegeneruje. Dobře vedené monorepo má hranice balíčků, vlastníky, kontrolu závislostí a nástroje, které umí pracovat jen s dotčenou částí.
- MýtusMonorepo vyřeší sdílení kódu samo od sebe.
- Ve skutečnostiMonorepo sdílení usnadní, ale nenahradí návrh stabilních rozhraní. Sdílené balíčky stále potřebují odpovědnost, testy a domluvený způsob zavádění změn.
Časté dotazy
- Kdy dává Monorepo smysl pro menší tým?
- Monorepo dává menšímu týmu smysl, když několik aplikací nebo knihoven mění stejní lidé a změny mezi nimi jsou časté. Typická situace je webová aplikace, administrace a sdílené UI komponenty. Jeden repozitář zjednoduší code review, sjednotí konfiguraci a sníží režii kolem verzování interních balíčků. Pokud jsou projekty zcela nezávislé, monorepo může přidat zbytečnou složitost.
- Musí Monorepo nasazovat všechny aplikace najednou?
- Monorepo nemusí nasazovat všechny aplikace najednou. Jeden repozitář řeší uložení kódu a historii změn, zatímco release proces může zůstat oddělený pro každou službu, knihovnu nebo aplikaci. Praktické nastavení obvykle používá CI pravidla podle změněných cest nebo podle grafu závislostí. Díky tomu se buildí a nasazuje pouze část, které se konkrétní commit týká.
- Dá se Monorepo používat bez speciálních nástrojů?
- Monorepo se dá používat i bez speciálních nástrojů, pokud je malé a změny nejsou výpočetně náročné. Běžný Git, jednoduché skripty a dobře pojmenované složky mohou stačit. S růstem počtu balíčků ale začne být důležité selektivní testování, cache buildů, přehled závislostí a automatické vlastnictví kódu. Bez těchto prvků se výhody monorepa rychle zmenšují.
- Kdy Monorepo začne brzdit vývoj?
- Monorepo začne brzdit vývoj, když každý commit spouští celý build, revieweři nedokážou najít odpovědné vlastníky nebo týmy zavádějí závislosti bez kontroly. Problémem bývá také obrovský checkout, dlouhá instalace závislostí a nejasná pravidla pro verzování sdílených balíčků. Řešením není jen rozdělení repozitáře, ale často lepší graf závislostí, cache a přísnější hranice modulů.
Zdroje
- Monorepo(otevře se v novém okně)
- Git - About(otevře se v novém okně)
- Git - Submodules(otevře se v novém okně)
- Why Google Stores Billions of Lines of Code in a Single Repository(otevře se v novém okně)