Monorepo: birden çok projeyi tek depoda yönetmek
Monorepo nedir, birden çok projeyi tek depoda tutmanın avantajları ve zorlukları neler? Nx, Turborepo ve Bazel gibi araçlarla çalışma mantığı ve örnek.
Monorepo nedir?
Monorepo (tek depo), birbiriyle ilişkili birden çok projenin, kütüphanenin ve uygulamanın tek bir sürüm kontrol deposunda tutulduğu yaklaşımdır. Karşıtı polyrepo, yani her projenin kendi deposunda yaşadığı düzendir.
Monorepo, tek bir devasa uygulama anlamına gelmez. Depo içinde web arayüzü, mobil uygulama, arka uç hizmetleri ve ortak kütüphaneler gibi birbirinden bağımsız paketler bulunabilir. Aralarındaki fark, hepsinin aynı geçmişi, aynı araç zincirini ve aynı sürümleme akışını paylaşmasıdır. Bu nedenle bir ortak kütüphanedeki değişiklik, onu kullanan uygulamalarla aynı değişiklik kümesi içinde yapılabilir.
Kavramı sürüm kontrol aracı Git ile karıştırmamak gerekir: monorepo bir depo düzenidir, Git ise bunu barındıran araçtır. Büyük depolarda Git'in ileri seviye kullanımı ve ek araçlar gerekebilir.
Avantajları
Monorepo'nun öne çıkan faydaları şunlardır:
- Atomik değişiklik: Ortak bir kütüphanenin arayüzü değiştiğinde, onu kullanan tüm projeler aynı değişiklikte güncellenir. Sürüm uyuşmazlığı kaynaklı kırılmalar azalır.
- Kod paylaşımı: Ortak bileşenler, tipler ve yardımcı fonksiyonlar ayrı paket yayınlama ihtiyacı olmadan doğrudan kullanılır.
- Tutarlı araçlar: Test, stil denetimi ve derleme kuralları tek yerde tanımlanır, tüm projeler aynı standardı izler.
- Görünürlük: Ekipler diğer projelerin kodunu görür, yeniden kullanım fırsatı fark edilir ve kod incelemesi çapraz ekipler arasında kolaylaşır.
- Bağımlılık yönetimi: Üçüncü taraf kütüphaneler için tek sürüm politikası uygulamak mümkündür.
Bu faydalar, projelerin birbirine gerçekten bağımlı olduğu ve aynı ekiplerce yönetildiği durumlarda en belirgindir.
Zorlukları ve bedeli
Monorepo ücretsiz bir kolaylık değildir. Depo büyüdükçe her değişiklikte tüm projeleri derleyip test etmek zamanla çok yavaşlar. Bu yüzden monorepo'larda genellikle yalnızca değişikliğten etkilenen projeleri bulup onları çalıştıran araçlar kullanılır. Önbellek mekanizması, daha önce aynı girdiyle hesaplanmış sonucu yeniden kullanarak süreyi kısaltır.
Bir başka zorluk sahiplik ve erişimdir. Herkes her kodu görebilir ama herkesin her yeri değiştirmesi istenmez. Sahiplik dosyaları ve gözden geçirme kuralları bu nedenle önem kazanır. Sonraki zorluk, sürüm kontrol aracının büyük depolarda yavaşlamasıdır; kısmi klonlama gibi özelliklerle hafifletilir.
Bir de kültürel yük vardır: ortak bir kütüphaneyi değiştirmek tüm ekipleri etkilediğinden, değişiklik disiplini ve iletişim daha sıkı olmalıdır.
Hangi araçlar kullanılır?
Monorepo yönetimi için çalışma alanı özelliği olan paket yöneticileri yeterli başlangıç sağlayabilir; ancak ölçek büyüdükçe özel araçlar devreye girer.
- Nx: Proje bağımlılık grafiğini çıkarır, etkilenen projeleri hesaplar, görev önbelleği ve kod üretimi sağlar.
- Turborepo: JavaScript ve TypeScript odaklı, görev hattı ve önbellekleme üzerine kurulu hafif bir araçtır.
- Bazel: Çok dilli ve çok büyük depolar için tasarlanmış, tekrarlanabilir (hermetik) derleme üzerine kurulu bir derleme sistemidir. Öğrenme eğrisi daha diktir.
Hepsinin ortak mantığı şudur: bağımlılık grafiğini bilmek, yalnızca etkilenenleri çalıştırmak ve sonuçları önbellekte saklamak.
Kurgusal bir örnek ve karar ölçütü
Örneğin bir şirketin web sitesi, yönetim paneli ve mobil uygulaması aynı tasarım bileşenlerini ve aynı API tiplerini kullanıyor olsun. Ayrı depolarda her bileşen değişikliği için paket yayınlanır, sürüm yükseltilir ve her uygulamada ayrı güncelleme yapılır. Monorepo'da ise bileşen değiştiğinde uygulamalar aynı değişiklikte güncellenir ve testler birlikte koşar.
Bunun tersine, birbirinden bağımsız ekiplerin hiç ortak kod paylaşmadığı ürünlerde monorepo ek karmaşıklıktan başka bir şey getirmeyebilir. Karar ölçütleri: projeler arası kod paylaşımı ne kadar yoğun, ekipler ne kadar iç içe çalışıyor, derleme süreleri yönetilebilir mi ve ekip araç zincirini bakım için ayırabilecek kapasitede mi?
Geçiş yapılacaksa tüm depoları birden taşımak yerine küçük bir projeyle başlayıp deneyim kazanmak daha az risklidir.
Mindset programlarında nerede çalışılır?
Mindset kataloğunda bu konuya birkaç program değinir. "Monorepo Yönetimi (Nx, Turborepo)" eğitimi monorepo kararı ve depo yapısı, görev hattı, bağımlılık grafiği ve etkilenen proje analizi, önbellek ve artımlı derleme, CI/CD entegrasyonu başlıklarını işler. "Monorepo Yönetimi ve Build Sistemleri (Bazel, Nx)" eğitiminde karar kriterleri, depo organizasyonu ve sahiplik, Bazel ile hermetik build, CI entegrasyonu ve geçiş planlaması yer alır. "Git İleri Seviye: Branching, Rebase ve Monorepo" eğitiminin son modülü monorepo iş akışları ve ekip standardıdır.
İlgili Mindset programı
Monorepo Yönetimi (Nx, Turborepo)
Sık sorulan sorular
Monorepo ile monolit aynı şey mi?
Hayır. Monolit, tek bir birim olarak dağıtılan uygulama mimarisidir. Monorepo ise kodun nasıl saklandığıyla ilgili bir depo düzenidir. Monorepo içinde pek çok bağımsız hizmet ve uygulama bulunabilir, bunların hepsi ayrı ayrı dağıtılabilir.
Monorepo büyük şirketlere özel midir?
Değildir. Küçük ekipler de ortak kod paylaşan birkaç projeyi tek depoda tutarak fayda görür. Büyük depolarda ek araçlar gerekir ama küçük ölçekte bir paket yöneticisinin çalışma alanı özelliği yeterli olabilir. Asıl ölçüt, projeler arasındaki bağımlılığın yoğunluğudur.
Monorepo'da her değişiklikte her şey yeniden mi derlenir?
Hayır. Nx, Turborepo ve Bazel gibi araçlar bağımlılık grafiğini kullanarak yalnızca değişiklikten etkilenen projeleri bulur ve çalıştırır. Girdi aynıysa önbellekteki sonucu yeniden kullanırlar. Bu mekanizma olmadan büyük depolarda derleme süreleri kabul edilemez hale gelir.
Polyrepo'dan monorepo'ya geçmek zor mudur?
Teknik taşıma genellikle yönetilebilir; asıl zorluk iş akışı, sahiplik ve CI düzenini yeniden kurmaktır. Geçmişi koruyarak depoları birleştirmek mümkündür. Önce küçük bir proje grubuyla başlayıp deneyim kazanmak, tüm depoları aynı anda taşımaktan daha güvenlidir.
İlgili rehberler
İlgili eğitimler
Kategori: Yazılım Geliştirme, DevOps ve Bulut Teknolojileri