Monorepo
Kısaca
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 nedir?
Monorepo, her projeye ayrı bir depo vermek yerine birbiriyle ilişkili birden fazla projeyi tek bir depoda saklar. Bir şirket, web uygulamasını, mobil uygulamasını, arka uç servislerini ve paylaşılan arayüz ile yardımcı kütüphanelerini apps/ ve packages/ gibi klasörlerde yan yana tutabilir. Proje başına bir depo olan karşıt yaklaşıma polyrepo ya da multi-repo düzeni denir.
Başlıca avantaj, her şeyin birlikte değişebilmesidir. Bir geliştirici, paylaşılan bir kütüphaneyi ve onu kullanan her projeyi tek bir commit ve pull request'te güncelleyebilir; bu da büyük yeniden düzenlemeleri atomik yapar ve depolar arasında sürüm numaralarıyla uğraşmayı ortadan kaldırır. Monorepo'lar ayrıca kod, araç ve yapılandırma paylaşmayı ve projelerin birbirine nasıl bağlı olduğunu görmeyi kolaylaştırır.
Monorepo, bir ailenin önemli belgelerini farklı evlere dağılmış kutularda değil, iyi düzenlenmiş tek bir dosya dolabında tutmasına benzer. Herkes şeylerin nerede olduğunu bilir, ama dolap büyüdükçe iyi bir düzene ihtiyaç duyar. Büyük ölçekte monorepo'lar, her değişiklikte her şeyi yeniden derleyip yeniden test etmemek için özel araçlara dayanır: npm, pnpm ve Yarn'daki workspace'ler yerel paketleri birbirine bağlar; Nx, Turborepo ve Bazel gibi derleme sistemleri ise sonuçları önbelleğe alır ve yalnızca bir değişiklikten etkilenen görevleri çalıştırır.
Monorepo, monolit ile aynı şey değildir. Monolit tek bir birim olarak dağıtılan tek bir uygulamadır; monorepo ise birbirinden bağımsız dağıtılan birçok mikroservisi içerebilir. Terim kodun nasıl çalıştığını değil, nerede saklandığını tanımlar. Monorepo'ların bazı ödünleşimleri de vardır: çok büyük geçmişlerde yavaşlayan Git işlemleri, net kod sahipliği kurallarına duyulan ihtiyaç ve neyin derleneceği konusunda akıllı olması gereken CI hatları gibi.
Önemli noktalar
- Monorepo, birçok projeyi ve paylaşılan kütüphaneyi tek bir depoda tutar.
- Projeler arası değişiklikler tek bir atomik commit'te yapılabilir.
- Workspace'ler ve Nx, Turborepo, Bazel gibi derleme araçları yalnızca etkilenen görevleri çalıştırarak derlemeleri hızlı tutar.
- Monorepo kodun nasıl saklandığını anlatır, mimariyi değil; mikroservisleri de monolitleri de barındırabilir.
- Alternatifi olan proje başına bir depo yaklaşımına polyrepo denir.
Örnek
# A typical monorepo layout:
# apps/web/ customer-facing website
# apps/api/ backend service
# packages/ui/ shared UI components
# package.json "workspaces": ["apps/*", "packages/*"]
# Install dependencies for every project at once
npm install
# Build just one project
npm run build --workspace=apps/web
# Run tests in every project that has a test script
npm test --workspaces --if-presentSık sorulan sorular
Monorepo ile polyrepo arasındaki fark nedir?
Monorepo birçok projeyi tek bir depoda saklarken, polyrepo düzeni her projeye kendi deposunu verir. Monorepo'lar kod paylaşmayı ve projeler arası değişiklik yapmayı basitleştirir; polyrepo'lar ise ekiplere daha fazla bağımsızlık tanır ve her depoyu küçük tutar.
Monorepo, monolit ile aynı şey midir?
Hayır. Monolit, tek bir birim olarak derlenen ve dağıtılan bir uygulamadır; monorepo ise yalnızca kodu saklama biçimidir. Tek bir monorepo, birbirinden bağımsız dağıtılan onlarca mikroservis içerebilir.
Monorepo'yu yönetmek için hangi araçlar kullanılır?
npm, pnpm ve Yarn'daki paket yöneticisi workspace'leri yerel paketleri birbirine bağlar. Nx, Turborepo ve Bazel gibi derleme araçları önbellekleme ekler ve yalnızca bir değişiklikten etkilenen görevleri çalıştırır; bu da depo büyüdükçe CI'ı hızlı tutar.
İlgili sayfalar
- RepositorySürüm Kontrolü, s. 34Repository, bir projenin tüm dosyalarını ve sürüm kontrol sisteminin kaydettiği her değişikliğin eksiksiz geçmişini barındıran depolama alanıdır.
- GitSürüm Kontrolü, s. 10Git, dosyalardaki değişiklikleri zamanla izleyen ücretsiz, açık kaynaklı dağıtık sürüm kontrol sistemidir; iş birliğini ve hataları geri almayı kolaylaştırır.
- MonolitYazılım Mimarisi, s. 25Monolit, tek parça olarak derlenip dağıtılan, tüm özelliklerin tek kod tabanını, tek süreci ve çoğunlukla tek veritabanını paylaştığı yazılım uygulamasıdır.
- MikroservislerYazılım Mimarisi, s. 24Mikroservisler, bir uygulamanın ağ üzerinden iletişim kuran, küçük ve bağımsız olarak dağıtılabilen servislere bölündüğü bir mimari tarzdır.
- CI/CDDevOps ve Bulut, s. 9CI/CD, kod değişikliklerini sık sık derleyen, test eden ve yayınlayan otomatik pratikler bütünüdür; yazılım kullanıcılara hızlı ve güvenli biçimde ulaşır.
- Semantic VersioningSürüm Kontrolü, s. 35Semantic versioning, her bölümün bir sürümün uyumluluğu bozduğunu, özellik eklediğini ya da hata düzelttiğini belirttiği MAJOR.MINOR.PATCH şemasıdır.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin