- uv’ye geçildiğinde Python bağımlılıklarını kurma hızı pip’e kıyasla yaklaşık 10 kat artıyor ve ayrı bir
venv olmadan da root olmayan (non-root) kullanıcıyla çalıştırmak mümkün oluyor
pyproject.toml tabanlı yapıda yalnızca üst düzey bağımlılıkları belirtmek yeterli; uv lock dosyasını otomatik olarak yönetiyor ve bağımlılık ağacı ile kesin sürüm yönetiminde pip freeze’den daha başarılı
- Dockerfile içinde uv ve uvx ikililerinin kopyalanması,
pyproject.toml/uv.lock dosyalarının kullanılması, ortam değişkenlerinin ayarlanması gibi adım adım değişiklikler gerekiyor
uv sync/add/remove, uv:outdated gibi komutlarla bağımlılık ekleme, kaldırma, güncelleme ve paketlerin en güncel sürümlerini kontrol etme gibi çeşitli yönetim işlemleri kolayca yapılabiliyor
- Lock dosyalarını düzenli yönetmek ve bağımlılık güncellemelerini sürdürmek mümkün hale geldiği için ekip çalışması ve dağıtım ortamlarında tutarlılık sağlama açısından avantaj sunuyor
10 kat daha hızlı bağımlılık kurulumu, venv kullanmadan, root olmayan ortam kurulumu
- uv, mevcut pip’e kıyasla Python projelerinde bağımlılık kurulum hızını büyük ölçüde iyileştiren bir araç
- uv kullanımıyla Flask/Django gibi çeşitli projelerde pip’e göre yaklaşık 10 kat daha hızlı kurulum deneyimi elde edilebiliyor
- Ayrı bir sanal ortam (
venv) olmadan da konteyner içinde root olmayan kullanıcıyla güvenli şekilde çalıştırmak mümkün
pyproject.toml ve requirements.txt karşılaştırması
- Mevcut
requirements.txt yerine yalnızca üst düzey bağımlılıkları pyproject.toml dosyasında belirtmek yeterli; uv otomatik olarak uv.lock dosyasını oluşturuyor
pyproject.toml içine [project] dependencies alanı ekleniyor
- mevcut
requirements.txt siliniyor
- uv’nin lock dosyası
pip freeze çıktısına benzer, ancak daha doğru bir bağımlılık ağacı ve sürüm bilgisi içeriyor
Dockerfile yapısındaki değişiklikler
- Kullanmak için uv ve uvx ikilileri konteynere kopyalanıyor (statik derlenmiş Rust ikilileri kullanılıyor)
- Mevcut
requirements*.txt yerine pyproject.toml, uv.lock* dosyaları kopyalanıyor
- Ortam değişkenleri ekleniyor:
UV_COMPILE_BYTECODE=1: bytecode’u build aşamasında önceden derler
UV_PROJECT_ENVIRONMENT="/home/python/.local": ayrı bir venv oluşturmadan paketleri belirli bir yola kurar
- Bağımlılık kurulum komutu da mevcut
pip3-install yerine uv-install olarak değiştiriliyor
- Örnek:
RUN chmod 0755 bin/* && bin/uv-install
Bağımlılık ekleme, kaldırma, güncelleme ve diğer yönetimler
- Ayrı bir run betiğiyle konteyner içinde uv komutları çalıştırılabiliyor
./run deps:install: image build edildikten sonra lock dosyasını host’a dışa aktararak kurulum yapar
./run deps:install --no-build: build yapmadan yalnızca lock dosyasını günceller
./run uv add mypackage --no-sync: yalnızca pyproject.toml ve lock dosyasını günceller, gerçek kurulum daha sonra yapılır
./run uv remove mypackage --no-sync: paketi kaldırır
./run uv:outdated: mevcut bağımlılıkların en güncel sürümlerini kontrol eder
Video ve uygulamalı rehber sunuluyor
- uv’ye geçiş,
pyproject.toml yazımı, Dockerfile değişiklikleri, lock/sync komutları, bağımlılık ekleme/kaldırma ve güncel sürüm kontrolü gibi konular için gerçek demo ve git diff örnekleri sunuluyor
- Flask ve Django için iki projenin migration diff’lerine de bakılabiliyor
2 yorum
Zaten Poetry ile dağıttığımız şeyi migrate etmeyi düşünüyordum; bu da stabil ve basit görünüyor ^^
Hacker News görüşü
uv'nin pyenv, virtualenv ve pip'in doğrudan yerine geçen bir iş akışını desteklediğine dikkat etmek gerekiyor. Bu, lockfile ya da pyproject.toml ile dayatılan bir yaklaşım değil.
uv python pin <version>komutuyla mevcut dizinde.python-versiondosyası oluşturulabiliyor,uv virtualenvile pyenv benzeri şekilde o sürüm Python indirilip.venvsanal ortamı yaratılabiliyor,uv pip install -r requirements.txtile requirements.txt içindeki paketler kurulabiliyor,uv run <command>ile de.envdosyasındaki ortam değişkenleri dahil edilerek komut çalıştırılabiliyor. Yalnız, ortam değişkeni önceliği konusunda dikkatli olmak lazım (ilgili issue)uv pipyavaş olabiliyor ve nedenini bilmiyorum; belki şirket ağ ortamıyla ilgilidirpyproject.tomliçinde de tutulduğunu sanıyordum; bu durumda.python-versiondosyası gerçekten gerekli mi diye merak ediyorumBöyle bir yaklaşım lock file'ın varlık nedenini anlamsızlaştırıyor. Dosya yoksa ya da geçersizse, bu lock file'da ciddi bir sorun olduğu anlamına gelir ve projeye hakim birinin buna doğrudan müdahale etmesi daha doğru olur. Aksi halde lock file tutmanın anlamı kalmaz. CI'ın lock file'ı otomatik değiştirip kafa karışıklığı yaratması da mümkün
uv lockanlaşılır bir mesajla hata veriyor ve shell script'teki errexit nedeniyle süreç anında duruyor.uv lock --checkiçin hata çıktısının yönlendirilmesi, aynı hatanın iki kez basılmasını önlemek için. Lock dosyasını bilerek bozup script'i çalıştırırsanız, belirli hata mesajıyla birlikte build duruyor. Script'i daha açık olması için if-else yapısına çevirdim. Lock file yoksa yenisini oluşturmak zaten doğru akış. Bu noktada oluşturup commit etmek yeterliuv sync --lockedseçeneğiyle kapsanıyor. Lock file yoksa ya da güncel değilse net biçimde hata veriyor. Build'lerin her zaman--lockedile çalıştırılmasını öneririm--frozenbayrağı kullanıldığında lock file'ın güncellenmemesi gerekirken pratikte tam tersi çalışıyor. Lock file yoksa ya da eşleşmiyorsa insan müdahalesi gerektiği görüşüne katılıyorumPython araçlarının Python dışındaki bir dille geliştirilmesine tamamen karşıyım. C zaten var ve CPython standartlaşmış durumda; durduk yere yeni bir dile (ör. Rust) gerek yok. Pendulum paketinin 3.13 desteğini 7 aydan uzun geciktirmesinin sebebi de Rust native kısmını düzeltebilecek insan sayısının az olması diye düşünüyorum. C olsaydı kendim düzeltirdim. (ilgili issue) İdeal olarak, Rust gibi harici bir dille hızlı bir datetime yapmak istiyorsanız, onu FFI üzerinden birden çok dilde kullanılabilecek biçimde sunmanız gerekir. Rust tabanlı yaklaşım hâlâ içime sinmiyor ve Linux topluluğunun buna mesafeli durmasını da artık anlayabiliyorum
pip yerine uv kullanırken dikkatli olmak lazım. Varsayılan olarak
pycdosyaları üretmiyor, bu da servis başlangıcını yavaşlatabilir (referans)Flask konteynerinde uv kullanınca sadece build süresi can sıkıcı ölçüde kısalmıyor, kurulum süreci de çok daha öngörülebilir hale geliyor. pip ile bağımlılık sürümlerinin değişmesinden doğan şaşkınlık yaşanmıyor.
pyproject.tomlkullanıpuv lockdemeniz yeterli. Docker'da yalnızcapyproject.tomlveuv.lockdosyalarını kopyalayıp (HOT COPY)uv sync --frozen --no-install-projectçalıştırırsanız, uygulama kodunu atlayarak kurulum katmanını cache'lemek mümkün. Tek bir paketin değişmesi yüzünden tüm katmanı yeniden build etmenin acısını bilen biri için bunun neden önemli olduğu açık.UV_PROJECT_ENVIRONMENT=/home/python/.localortam değişkeniyle venv kullanmadan base image'ı pre-warm etmek, build paylaşımı ve altyapı maliyetlerinde tasarruf sağlayabiliyor.UV_COMPILE_BYTECODE=1seçeneğiyle build sırasında.pycdosyaları da oluşturuluyor. Mutable environment ortadan kalkıyor ve reproducibility zorunlu hale geliyor; artık build başarısız olursa sebebin lockfile olduğu netleşiyor2025 olmuşken bile Python paketleme ve bağımlılık yönetimi hâlâ karmaşık durumda
requirements.txtvevenvbana yetiyoruv, pip, conda gibi Python paket yöneticilerinin güvenliğini karşılaştırmayı merak ediyorum. Hız güzel ama paket yöneticisinin güvenliği bence çok daha önemli
PyPI'ye paket yükleyen biri olarak, şahsen hızından dolayı uv kullanmak isterim ama pip ile tamamen aynı şekilde çalıştığı garanti edilmiyorsa kolay kolay geçemem. Sonuçta bir kullanıcı
pip install xxxile hata alırsa, benim de aynı ortamı yeniden kurup sorunu debug edebilmem gerekirUV'nin, sadece çalıştırdığınızda bile iyi sonuç veren ve son dönemde Python paketleme dünyasındaki en olumlu değişimlerden biri olduğunu düşünüyorum
Üretim ortamı konteynerleri kurarken uv kullanımına dair çok iyi bir rehber de paylaşılmış (rehbere bakın)