Yan yana
MonorepovsPolyrepo
Monorepo ile polyrepo arasındaki fark nedir?
Güncellendi 3 dk okuma8 fark
Kısaca
Monorepo birçok projeyi birlikte değişebilsinler diye tek bir depoda tutar; polyrepo ise her projeye kendi deposunu, geçmişini ve sürüm döngüsünü verir.
Monorepo
Monorepo, uygulamalar, servisler ve paylaşılan kütüphaneler gibi birçok projenin kodunu birlikte yönetilen tek bir sürüm kontrol deposunda tutma yaklaşımıdır.
Monorepo sayfasını okuPolyrepo
Polyrepo, her projenin, servisin ya da kütüphanenin kendi geçmişi, hattı ve sürüm döngüsü olan ayrı bir sürüm kontrol deposunda tutulduğu düzendir.
Polyrepo sayfasını okuMonorepo ve Polyrepo karşılaştırması
| Özellik | Monorepo | Polyrepo |
|---|---|---|
| Depolar | Birçok proje için tek depo | Proje, servis ya da kütüphane başına bir depo |
| Projeler arası değişiklik | Tek bir atomik commit ve pull request | Kütüphanenin yeni bir sürümü, ardından onu kullanan her projede bir pull request |
| Paylaşılan kod | Doğrudan kaynaktan, her zaman güncel sürümüyle içe aktarılır | Bir kayıt defterinden sürümlü paketler olarak kullanılır |
| Bağımlılık sürümleri | Genellikle her bağımlılığın herkes için tek bir sürümü | Her depo kendi seçer; sürümler zamanla birbirinden uzaklaşır |
| Ekip bağımsızlığı | Daha düşük: ortak araçlar, kurallar ve ana dal | Daha yüksek: kendi geçmişi, izinleri, hattı ve sürümleri |
| Erişim denetimi | Erişimi olan herkes bütün kodu görür; CODEOWNERS yola göre inceleyicileri belirler | Depo başına ayarlanır; böylece kod bir ekibe özel kalabilir |
| Gereken araçlar | Workspace'ler ve yalnızca değişeni derlemek için Nx, Turborepo ya da Bazel | Bir paket kayıt defteri ve Dependabot ya da Renovate gibi botlar |
| Ölçeklenme sancıları | Büyük klonlar, yavaşlayan Git işlemleri, etkilenmeyen işi atlaması gereken CI | Tekrarlanan yapılandırma, sürüm kayması, birçok depoya yayılan değişiklikler |
Fark, açıklamalı
Monorepo; uygulamalar, servisler ve paylaşılan kütüphaneler gibi birbiriyle ilişkili birçok projeyi, genellikle apps/ ve packages/ gibi klasörlerde, tek bir sürüm kontrol deposunda saklar. Multi-repo olarak da anılan polyrepo düzeni ise her projeye kendi geçmişi, izinleri, CI hattı ve sürümleri olan ayrı bir depo verir. İkisi de kodun nasıl çalıştığını değil, nerede saklandığını tanımlar.
Asıl fark, paylaşılan kodun nasıl dolaştığıdır. Monorepo'da paylaşılan bir kütüphanedeki değişiklik ve onu kullanan her projedeki uyarlama tek bir atomik commit ve pull request'te yapılabilir; her şey de her zaman güncel sürüme karşı derlenir. Polyrepo'da ise kütüphane sürümlü bir paket olarak yayımlanır ve onu kullanan her proje, ekibi hazır olduğunda kendi pull request'iyle yükseltme yapar; bu ekiplere bağımsızlık verir, ama sürümler birbirinden uzaklaşır ve birçok projeyi kesen değişiklikler pek çok adım ister.
Her model ölçeklenmek için araç ister. Monorepo'lar npm, pnpm ya da Yarn'daki workspace'lere, sonuçları önbelleğe alıp yalnızca bir değişikliğin etkilediği görevleri çalıştıran Nx, Turborepo ya da Bazel gibi derleme sistemlerine ve CODEOWNERS dosyası gibi sahiplik kurallarına dayanır. Polyrepo'lar ise paket kayıt defterlerine ve yükseltme pull request'leri açan Dependabot ve Renovate gibi botlara dayanır. Birçok kuruluş da ürün alanı başına birkaç monorepo kurarak ikisini karıştırır.
Sık yapılan bir yanlış, monorepo'nun monolit demek olduğu ya da mikroservislerin polyrepo gerektirdiği düşüncesidir. Tek bir monorepo, birbirinden bağımsız dağıtılan düzinelerce servisi barındırabilir; bir monolit de başka depolardaki kütüphaneleri kullanabilir. Bir başkası, monorepo'ların yalnızca dev şirketlere uyduğu düşüncesidir; küçük ekipler, CI yalnızca değişeni derlediği sürece tek bir depoyu çoğu zaman daha basit bulur.
Hangisini kullanmalısınız?
Monorepo şu durumlarda doğru seçim:
- Projeler çok kod paylaşıyor ve sık sık birlikte değişiyor.
- Büyük yeniden düzenlemeler ve bağımlılık yükseltmeleri tek bir commit'te yapılmalı.
- Tek bir araç, lint ve CI yapılandırması her yerde geçerli olmalı.
- Küçük bir ekip frontend, backend ve paylaşılan paketler üzerinde birlikte çalışıyor.
Polyrepo şu durumlarda doğru seçim:
- Ekipler ayrı servislerin sahibi ve kendi takvimlerine göre sürüm çıkarıyor.
- Projeler az kod paylaşıyor ya da paylaştıklarını kararlı, sürümlü paketlerle paylaşıyor.
- Erişim projeye göre farklı olmalı; örneğin dış yükleniciler ya da açık kaynak bölümler için.
- Her deponun küçük kalmasını istiyorsunuz ve ek derleme araçlarına ihtiyacınız yok.
Paylaşılan bir arayüz kütüphanesinde bir prop'un adını değiştirmek, iki yolla
# Monorepo: change the shared library and its users in one commit
git switch -c rename-button-prop
# edit packages/ui/Button.tsx and every caller in apps/web and apps/admin
npx turbo run test --affected # test only the projects the change touches
git commit -am "refactor(ui): rename Button's kind prop to variant"
git push # one pull request, reviewed and merged as a whole# Polyrepo: release the library, then upgrade each consumer separately
cd ui-kit
git commit -am "feat!: rename Button's kind prop to variant"
npm version major && npm publish # 3.0.0, a breaking release
cd ../web-app # a separate repository, its own pull request
npm install @acme/ui-kit@3.0.0
# update the callers, then commit and open a pull request
cd ../admin-app # and again here, whenever that team is readySık sorulan sorular
Monorepo, monolit ile aynı şey midir?
Hayır. Monolit, tek bir birim olarak dağıtılan tek bir uygulamadır; monorepo ise yalnızca kodu saklama biçimidir ve birbirinden bağımsız derlenip dağıtılan birçok servisi barındırabilir.
Büyük şirketler monorepo kullanır mı?
Google ve Meta dahil bazı tanınmış şirketler, o ölçek için geliştirdikleri özel araçlarla kullanır. Birçoğu ise polyrepo ya da ikisinin bir karışımını kullanır; yani şirket büyüklüğü tek başına bu kararı belirlemez.
Polyrepo'dan monorepo'ya geçebilir miyim?
Evet. git subtree ya da git filter-repo, depoları geçmişlerini koruyarak birleştirebilir; ardından workspace'ler projeleri birbirine bağlar. Ekipler genellikle önce birbirine en sıkı bağlı projeleri taşır.