18 puan yazan darjeeling 2025-11-09 | 1 yorum | WhatsApp'ta paylaş

UV Workspaces ile Python monorepo yönetimi özeti

Bu video, tek bir Git deposunda birden fazla Python uygulamasını (monorepo) yönetirken ortaya çıkan sorunların UV Workspaces özelliği kullanılarak nasıl temiz ve düzenli biçimde çözülebileceğini anlatıyor.

1. Video özeti

Sorunlar

Tek bir depoda CLI aracı ile FastAPI uygulamasını aynı anda geliştirirken şu sorunlar ortaya çıkabilir.

  • Kod tekrarı: CLI ile API'nin ortak kullandığı işlevlerin (ör. başlık crawling fonksiyonu) kopyala-yapıştır ile çoğaltılması gerekir.
  • Karmaşık ortam yönetimi: Her uygulama için ayrı bir sanal ortam yönetmek gerektiğinden bağımlılık sürümleri çakışabilir veya disk alanı boşa harcanabilir.

Çözüm: UV Workspaces

UV Workspaces, bu sorunları çözmek için iki temel özellik sunar.

  1. Paylaşılan bağımlılıklar ve tek bir sanal ortam

    • Proje kökündeki pyproject.toml dosyasında ortak bağımlılıklar tanımlanabilir.
    • uv sync komutu çalıştırıldığında UV, bu yapılandırma dosyasını okuyarak depo genelinde paylaşılan tek bir sanal ortamı (.venv) kök klasörde oluşturur.
    • Böylece tüm alt projeler (CLI, API vb.) aynı ortamı ve bağımlılıkları paylaşır; sürüm çakışmaları önlenir ve yönetim kolaylaşır.
  2. Dahili paketlerle kod paylaşımı

    • Tekrarlanan ortak kod (ör. fetch_headlines fonksiyonu) core gibi ayrı bir "dahili paket"e ayrılabilir.
    • Workspace ayarıyla bu core paketi PyPI yerine yerel bir kaynak olarak tanımlanır.
    • Ardından CLI uygulaması ile API uygulaması bu ortak kodu from core.news import fetch_headlines gibi bir import ile yeniden kullanabilir.

2. UV Workspaces nasıl kullanılır

1. adım: Workspace yapılandırması

Proje kök klasöründe bir pyproject.toml dosyası oluşturup [tool.uv.workspace] bölümünü tanımlayarak alt projelerin nerede bulunduğunu belirtirsiniz.

[tool.uv.workspace]  
# "packages" klasörü içindeki tüm alt klasörleri workspace üyesi olarak tanır  
members = ["packages/*"]  

2. adım: Bağımlılık yönetimi

  • Paylaşılan bağımlılıklar: Tüm projelerin ortak kullandığı bağımlılıklar (ör. python-dotenv) kök pyproject.toml dosyasına eklenir.
  • Uygulamaya özel bağımlılıklar: Yalnızca belirli bir uygulamada kullanılan bağımlılıklar (ör. fastapi, uvicorn) ilgili uygulamanın pyproject.toml dosyasına (ör. packages/api/pyproject.toml) eklenir.
  • Kök klasörde uv sync çalıştırıldığında UV tüm pyproject.toml dosyalarını tarar ve kök sanal ortama gerekli tüm bağımlılıkları kurar.

3. adım: Dahili paketle kod paylaşımı

  1. packages/core gibi, paylaşılan kodu barındıracak yeni bir paket (klasör) oluşturun.
  2. Bu paketi kök pyproject.toml dosyasına sıradan bir bağımlılık gibi ekleyin.
  3. Kök pyproject.toml dosyasına [tool.uv.sources] bölümünü ekleyerek core paketinin PyPI yerine workspace içinden bulunmasını sağlayın.
<!-- end list -->
[project]  
# 1. Dahili paketi bağımlılık olarak ekle  
dependencies = [  
    "core",  
    "python-dotenv"  
]  
  
# 2. 'core'un yerel workspace paketi olduğunu belirt  
[tool.uv.sources]  
core = { workspace = true }  
  1. uv sync komutunu yeniden çalıştırdığınızda core paketi yerel kaynak olarak kurulur.
  2. Artık packages/api veya packages/cli içinde ortak kodu from core.news import ... sözdizimiyle içe aktarabilirsiniz.

4. adım: Projeyi çalıştırma

Belirli bir projeyi çalıştırırken uv run --from <paket_adı> kullanılır.

# API sunucusunu çalıştır  
uv run --from packages/api uvicorn main:app --reload  
  
# CLI aracını çalıştır  
uv run --from packages/cli python main.py  

3. Kimler için önerilir

  • Tek bir depoda birden fazla küçük otomasyon betiği, webhook, API, CLI vb. yönetiliyorsa.
  • Bu uygulamalar ortak mantık ya da bağımlılıklar paylaşıyorsa özellikle faydalıdır.
  • Buna karşılık, tek bir betik, PyPI'ye bağımsız olarak dağıtılacak bir paket ya da birbiriyle tamamen ilgisiz uygulamaları yönetmek için uygun olmayabilir.

Orijinal video bağlantısı: https://www.youtube.com/watch?v=N_ypJwV8Q8I

1 yorum

 
pcj9024 2025-11-10

pnpm'e oldukça benziyor.