Monorepolarda Bağımlılık Yönetimi ve Çakışma Çözümleri

June 10, 2025 (2d ago)

Monorepolarda Bağımlılık Yönetimi ve Çakışma Çözümleri

Monorepo kavramını incelediğimizde, çoğu zaman gözden kaçırdığımız önemli bir konu var: projedeki paketlerin nasıl yönetileceği. Bu da bizi doğrudan şu soruyu düşündürüyor: Monorepo kullanırken paketleri hangi stratejiyle yönetmeliyiz? Bu yazımda, benim de Turborepo deneyimlerimle öğrendiğim monorepo mimarisinin paket yönetimi yaklaşımını ve bu yaklaşımlarda çoğu zaman başımıza gelen çakışma durumunu nasıl çözeceğimizi ele alacağım.

Monorepo'nun temel amacı, kodun yeniden kullanımını artırmak. Mantık basit: packages klasöründeki paylaşılan bir kütüphaneyi, apps klasöründeki uygulamalarınızda kullanmak. Kulağa kolay gelse de, bu paylaşımı teknik olarak nasıl yapacağınız, özellikle de monorepoyla yeni tanışıyorsanız, başta kafa karıştırıcı olabilir.


Bağımlılıklar: dependencies, devDependencies ve peerDependencies

Paket yönetimi deyince akla ilk gelenler dependencies ve devDependencies'tır. Bunlar çoğu zaman yeterli olsa da, monorepo gibi ortamlarda peerDependencies kavramını iyi anlamak şart.


peerDependencies Nedir?

peerDependencies, bir paketin doğru çalışması için başka bir paketin belirli bir sürümüne "ihtiyaç duyduğunu" belirtir, ancak o paketi kendisi yüklemez. Bunun yerine, bu paketin kullanıldığı "üst" projenin (yani monorepo'daki uygulamanızın) o bağımlılığı sağlamasını bekler.

Şöyle düşünün: Bir UI bileşenleri kütüphanesi yazdınız (@monorepo/ui-components). Bu kütüphane React'e bağımlı. Eğer siz react'i doğrudan dependencies olarak @monorepo/ui-components'e eklerseniz, bu kütüphaneyi kullanan her uygulama kendi node_modules klasörüne React'in bir kopyasını indirecek. Bu, aynı React sürümünü kullanan birden fazla uygulamanız varsa gereksiz yere disk alanı tüketimi ve potansiyel sürüm çakışmaları yaratır.

İşte burada peerDependencies devreye giriyor. @monorepo/ui-components paketinizin package.json dosyasına şunu yazabilirsiniz:

{
  "name": "@monorepo/ui-components",
  "version": "1.0.0",
  "peerDependencies": {
    "react": ">=19.0.0",
    "react-dom": ">=19.0.0"
  }
}

Bu, @monorepo/ui-components paketini kullanan her uygulamanın (örneğin apps/web) kendi package.json dosyasına react ve react-dom'u eklemesini bekler. Eğer uygulama bu bağımlılıkları sağlamazsa, paket yöneticiniz size bir uyarı verir.


Çakışan Paketleri Nasıl Çözeriz?

peerDependencies uyarıları veya hataları, paket sürümlerinde bir tutarsızlık olduğunu gösterir. Örneğin, ui-components React 19 isterken, apps/web React 18 kullanıyorsa. Bu durumu çözmek için birkaç yöntemimiz var:

1. Sürümleri Eşitlemek (En İdeal Yaklaşım)

En sağlıklı çözüm, çakışan paketin sürümünü monorepo genelinde eşitlemektir.

2. Paket Yöneticisi Özel Çözümleri

Bazı durumlarda, tüm bağımlılıkları eşitlemek zor olabilir. Paket yöneticileri bu durumlar için özel çözümler sunar:


Sonuç Olarak

Monorepo'larda bağımlılık çakışmaları kaçınılmazdır. Önemli olan, peerDependencies kavramını doğru anlayarak ve sürümleri eşitleme ya da paket yöneticilerinin resolutions/overrides gibi özelliklerini kullanarak bunları etkili bir şekilde çözmektir. Temel hedef, tüm bağımlılıkları monorepo genelinde tutarlı tutmaktır. Bu, geliştirme akışını düzene sokar ve daha stabil bir proje yapısı sağlar.

Sonraki yazımda görüşmek üzere. Hoşçakalın…