Karmaşık yazılım projeleri üzerinde çalışırken, monorepo ve polyrepo arasındaki tercih ekibinizin verimliliğini ve kodun ölçeklenebilirliğini önemli ölçüde etkileyebilir. Bu makalede, her yaklaşımın farklarını, avantaj ve dezavantajlarını analiz ediyor ve hangisinin sizin için doğru olduğunu anlamanıza yardımcı oluyoruz.
Monorepo ve Polyrepo Nedir?
Monorepo
Bir monorepo (monolitik depo), genellikle birbiriyle ilişkili birden fazla proje, hizmet veya paketin kaynak kodunu içeren tek bir depodur.
my-monorepo/ packages/ frontend/ backend/ shared/ package.json turbo.json
Polyrepo
Bir polyrepo (çoklu depolar), her proje, hizmet veya paketin kendi ayrı deposuna sahip olması anlamına gelir.
repos/ frontend/ package.json backend/ package.json shared/ package.json
Görsel Fark
Avantajlar ve Dezavantajlar
Monorepo
Avantajlar:
- Kod paylaşımını kolaylaştırır (örn. paylaşılan kütüphaneler).
- Birden fazla proje üzerinde atomik refactoring.
- Bağımlılıkların ve yapılandırmaların merkezi yönetimi.
Dezavantajlar:
- Kod tabanı büyüdükçe ağırlaşabilir.
- Kısmi build/test yönetimi için araçlar gerektirir (örn. Nx, Turborepo).
Polyrepo
Avantajlar:
- Her ekip/proje bağımsızdır.
- Küçük projeler için yönetimi daha kolaydır.
- Granüler erişim politikalarına izin verir.
Dezavantajlar:
- Paket yayınlamadan kod paylaşmak daha zordur.
- Depolar arası refactoring daha karmaşıktır.
- Yapılandırmaların olası tekrarlanması.
Pratik Örnek: Turborepo ile Monorepo
Turborepo kullanarak frontend ve backend içeren bir monorepo oluşturmak istediğinizi varsayalım.
1. Monorepo'yu başlatın
npx create-turbo@latest
2. Tipik yapı
my-monorepo/ apps/ web/ # frontend Next.js api/ # backend Node.js/Express packages/ ui/ # shared component library utils/ # shared functions turbo.json package.json
3. package.json'da workspace örneği
{ "private": true, "workspaces": [ "apps/*", "packages/*" ] }
4. Paylaşılan kütüphane içe aktarma örneği
packages/utils/src/formatDate.ts'de bir fonksiyonunuz olduğunu varsayalım:
// packages/utils/src/formatDate.ts export function formatDate(date: Date): string { return date.toLocaleDateString('en-US'); }
Frontend'de:
// apps/web/pages/index.tsx import { formatDate } from '@myorg/utils'; export default function Home() { return <div>Today is {formatDate(new Date())}</div>; }
Monorepo Ne Zaman Seçilmeli?
- Birden fazla ilişkili proje üzerinde çalışan orta-büyük ekipler.
- Kod paylaşımı ve büyük ölçekli refactoring ihtiyacı.
- Hızla büyüyen ve optimize edilmiş build/test gerektiren projeler.
Polyrepo Ne Zaman Seçilmeli?
- Küçük veya bağımsız projeler.
- Farklı ürünler üzerinde çalışan ayrı ekipler.
- Çok kısıtlayıcı erişim politikaları.
Sonuç
Herkes için mükemmel bir çözüm yoktur. Tercih ekip büyüklüğüne, proje karmaşıklığına ve işbirliği ihtiyaçlarına bağlıdır. Önemli olan ödünleşimlerin farkında olmak ve karmaşıklığı yönetmek için doğru araçları seçmektir.