UV Workspaces ile Python monorepo yönetimi
(secondb.ai)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.
-
Paylaşılan bağımlılıklar ve tek bir sanal ortam
- Proje kökündeki
pyproject.tomldosyasında ortak bağımlılıklar tanımlanabilir. uv synckomutu ç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.
- Proje kökündeki
-
Dahili paketlerle kod paylaşımı
- Tekrarlanan ortak kod (ör.
fetch_headlinesfonksiyonu)coregibi ayrı bir "dahili paket"e ayrılabilir. - Workspace ayarıyla bu
corepaketi PyPI yerine yerel bir kaynak olarak tanımlanır. - Ardından CLI uygulaması ile API uygulaması bu ortak kodu
from core.news import fetch_headlinesgibi birimportile yeniden kullanabilir.
- Tekrarlanan ortak kod (ör.
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ökpyproject.tomldosyasına eklenir. - Uygulamaya özel bağımlılıklar: Yalnızca belirli bir uygulamada kullanılan bağımlılıklar (ör.
fastapi,uvicorn) ilgili uygulamanınpyproject.tomldosyasına (ör.packages/api/pyproject.toml) eklenir. - Kök klasörde
uv syncçalıştırıldığında UV tümpyproject.tomldosyalarını tarar ve kök sanal ortama gerekli tüm bağımlılıkları kurar.
3. adım: Dahili paketle kod paylaşımı
packages/coregibi, paylaşılan kodu barındıracak yeni bir paket (klasör) oluşturun.- Bu paketi kök
pyproject.tomldosyasına sıradan bir bağımlılık gibi ekleyin. - Kök
pyproject.tomldosyasına[tool.uv.sources]bölümünü ekleyerekcorepaketinin PyPI yerine workspace içinden bulunmasını sağlayın.
[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 }
uv synckomutunu yeniden çalıştırdığınızdacorepaketi yerel kaynak olarak kurulur.- Artık
packages/apiveyapackages/cliiçinde ortak kodufrom 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
pnpm'e oldukça benziyor.