Ana içeriğe geç

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ı oku

Polyrepo

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ı oku

Monorepo ve Polyrepo karşılaştırması

ÖzellikMonorepoPolyrepo
DepolarBirçok proje için tek depoProje, servis ya da kütüphane başına bir depo
Projeler arası değişiklikTek bir atomik commit ve pull requestKütüphanenin yeni bir sürümü, ardından onu kullanan her projede bir pull request
Paylaşılan kodDoğrudan kaynaktan, her zaman güncel sürümüyle içe aktarılırBir kayıt defterinden sürümlü paketler olarak kullanılır
Bağımlılık sürümleriGenellikle 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 dalDaha yüksek: kendi geçmişi, izinleri, hattı ve sürümleri
Erişim denetimiErişimi olan herkes bütün kodu görür; CODEOWNERS yola göre inceleyicileri belirlerDepo başına ayarlanır; böylece kod bir ekibe özel kalabilir
Gereken araçlarWorkspace'ler ve yalnızca değişeni derlemek için Nx, Turborepo ya da BazelBir 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 CITekrarlanan 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

Monorepobash
# 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
Polyrepobash
# 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 ready

Sı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.

Daha fazla

Ayarlar