- Beralih ke uv membuat kecepatan instalasi dependensi Python menjadi sekitar 10 kali lebih cepat dibandingkan pip, dan aplikasi juga dapat berjalan sebagai pengguna non-root tanpa venv terpisah
- Dengan basis pyproject.toml, cukup deklarasikan dependensi tingkat atas dan uv akan mengelola file lock secara otomatis, sehingga pohon dependensi dan pengelolaan versi yang presisi lebih baik daripada
pip freeze
- Di Dockerfile, diperlukan perubahan bertahap seperti menyalin biner uv dan uvx, menggunakan file pyproject.toml/uv.lock, serta mengatur environment variable
- Melalui perintah seperti uv sync/add/remove, uv:outdated, Anda dapat dengan mudah menambah, menghapus, memperbarui dependensi, dan memeriksa versi terbaru paket
- Pengelolaan file lock dan pembaruan dependensi secara rutin menjadi lebih mudah, sehingga memberi keuntungan dalam menjaga konsistensi pada lingkungan kolaborasi dan deployment
Instalasi dependensi 10x lebih cepat, tanpa venv, dan konfigurasi lingkungan non-root
- uv adalah alat yang secara signifikan meningkatkan kecepatan instalasi dependensi proyek Python dibandingkan pip
- Dengan mengadopsi uv, berbagai proyek seperti Flask/Django dapat merasakan kecepatan instalasi sekitar 10 kali lebih cepat dibandingkan pip
- Bahkan tanpa virtual environment (venv) terpisah, aplikasi tetap dapat berjalan dengan aman sebagai pengguna non-root di dalam container
pyproject.toml vs requirements.txt
- Alih-alih
requirements.txt, cukup tuliskan dependensi tingkat atas di file pyproject.toml dan uv akan otomatis membuat file uv.lock
- Tambahkan entri
[project] dependencies di pyproject.toml
- Hapus
requirements.txt yang lama
- File lock milik uv mirip dengan hasil
pip freeze, tetapi memiliki pohon dependensi dan informasi versi yang akurat
Perubahan konfigurasi Dockerfile
- Gunakan dengan menyalin biner uv dan uvx ke dalam container (memakai biner Rust yang dikompilasi statis)
- Alih-alih
requirements*.txt, salin file pyproject.toml, uv.lock\*
- Tambahkan environment variable:
UV_COMPILE_BYTECODE=1: melakukan precompile ke bytecode pada tahap build
UV_PROJECT_ENVIRONMENT="/home/python/.local": menginstal paket ke path tertentu tanpa membuat venv terpisah
- Perintah instalasi dependensi juga diubah dari
pip3-install menjadi uv-install
- Contoh:
RUN chmod 0755 bin/* && bin/uv-install
Mengelola penambahan, penghapusan, pembaruan dependensi, dan lainnya
- Perintah uv di dalam container dapat dijalankan melalui skrip run terpisah
./run deps:install: menginstal setelah image dibangun sambil mengekspor file lock ke host
./run deps:install --no-build: hanya memperbarui file lock tanpa build
./run uv add mypackage --no-sync: hanya memperbarui pyproject.toml dan file lock, instalasi aktual dijalankan terpisah
./run uv remove mypackage --no-sync: menghapus paket
./run uv:outdated: memeriksa versi terbaru dari dependensi saat ini
Tersedia video dan panduan praktik
- Disediakan demo nyata dan contoh git diff untuk adopsi uv, penulisan
pyproject.toml, perubahan Dockerfile, perintah lock/sync, penambahan/penghapusan dependensi, serta pengecekan versi terbaru
- Diff migrasi untuk dua proyek, Flask dan Django, juga dapat dijadikan referensi
2 komentar
Kebetulan saya juga sedang ingin memigrasikan deployment yang sebelumnya memakai Poetry, dan ini terlihat stabil serta sederhana ^^
Komentar Hacker News
Perlu dicatat bahwa uv mendukung alur kerja yang langsung menggantikan pyenv, virtualenv, dan pip. Ini bukan pendekatan yang dipaksakan lewat lockfile atau pyproject.toml. Dengan perintah
uv python pin <version>, file .python-version dibuat di direktori saat ini; denganuv virtualenv, Python versi tersebut diunduh seperti pyenv lalu dibuat lingkungan virtual .venv; denganuv pip install -r requirements.txt, paket dari requirements.txt dipasang; dan denganuv run <command>, perintah bisa dijalankan sambil memuat variabel lingkungan dari file .env. Namun, perlu hati-hati terhadap masalah prioritas variabel lingkungan (isu terkait)uv pipterasa lambat dan belum tahu penyebabnya, mungkin karena lingkungan jaringan kantorPendekatan seperti ini membuat makna keberadaan lock file jadi kabur. Jika file tidak ada atau tidak valid, berarti ada masalah serius pada lock file dan sebaiknya ditangani langsung oleh orang yang paham proyek terkait. Jika tidak, tidak ada alasan menyimpan lock file. Di CI, lock file bisa terganti otomatis dan menimbulkan kebingungan
uv lock, proses gagal dengan pesan yang jelas, lalu langsung berhenti karenaerrexitpada shell script. Pengalihan error diuv lock --checkhanya untuk mencegah error yang sama tercetak dua kali. Jika lock file sengaja dibuat salah lalu skrip dijalankan, build akan berhenti dengan pesan error yang spesifik. Skrip juga sudah diubah menjadi if-else agar lebih jelas. Jika lock file belum ada, memang alurnya benar untuk membuat yang baru. Setelah itu tinggal dibuat dan di-commituv sync --locked. Jika lock file tidak ada atau sudah kedaluwarsa, perintah akan gagal dengan jelas. Disarankan selalu melakukan build dengan opsi--locked--frozen, lock file seharusnya tidak diperbarui, tetapi kenyataannya justru berjalan sebaliknya. Setuju bahwa jika lock file tidak ada atau tidak cocok, manusia harus turun tanganSaya sangat tidak setuju dengan alat Python yang dikembangkan dalam bahasa selain Python. C sudah ada dan CPython sudah distandardisasi, jadi tidak perlu bahasa baru lagi seperti Rust. Paket Pendulum terlambat lebih dari 7 bulan dalam mendukung 3.13, dan saya menduga itu karena komponen native Rust membuat orang yang bisa memperbaikinya sangat sedikit. Kalau itu C, saya mungkin akan memperbaikinya sendiri. (isu terkait) Idealnya, jika ingin membuat datetime cepat dengan bahasa eksternal seperti Rust, itu seharusnya dibuat melalui FFI dalam bentuk yang bisa dipakai banyak bahasa. Basis Rust masih terasa kurang meyakinkan, dan saya mulai paham kenapa komunitas Linux enggan terhadapnya
Saat memakai uv alih-alih pip, perlu berhati-hati. Secara default uv tidak membuat file pyc, jadi startup service bisa menjadi lebih lambat (referensi)
Jika uv dipakai di container Flask, bukan cuma perbedaan build time-nya sangat besar sampai terasa membosankan, tetapi proses instalasinya juga jadi sangat dapat diprediksi. Tidak ada lagi kejengkelan karena versi dependensi berubah saat memakai pip. Cukup pakai pyproject.toml lalu jalankan
uv lock, selesai. Di Docker, cukup salin file pyproject.toml dan uv.lock saja (HOT COPY) lalu jalankanuv sync --frozen --no-install-project, maka kode aplikasi dilewati dan layer instalasi bisa di-cache. Kalau pernah merasakan sakitnya membangun ulang seluruh layer hanya karena satu paket berubah, akan terasa kenapa fitur ini penting. Saat memakai variabel lingkunganUV_PROJECT_ENVIRONMENT=/home/python/.local, base image bisa di-pre-warm tanpa venv sehingga build bisa dibagi dan biaya infrastruktur berkurang. Dengan opsiUV_COMPILE_BYTECODE=1, file .pyc dibuat saat build. Lingkungan mutable pun hilang dan reproducibility dipaksakan; sekarang kalau build gagal, penyebabnya jelas ada di lockfileBahkan di tahun 2025, packaging dan manajemen dependensi Python masih tetap kacau
Saya penasaran soal perbandingan keamanan pengelola paket Python seperti uv, pip, dan conda. Kecepatan memang bagus, tetapi menurut saya keamanan package manager jauh lebih penting
Sebagai orang yang mengunggah paket ke PyPI, saya pribadi ingin memakai uv karena kecepatannya, tetapi kalau tidak ada jaminan bahwa perilakunya benar-benar sama dengan pip, saya sulit langsung beralih. Jika pengguna mengalami error saat
pip install xxx, saya juga harus bisa mereproduksi dan men-debug di lingkungan yang samaMenurut saya uv adalah salah satu perubahan paling positif dalam packaging Python belakangan ini, alat yang cukup dijalankan saja lalu memberikan hasil yang baik
Juga diperkenalkan dokumen panduan yang sangat bagus untuk membangun container produksi dengan uv (lihat panduan)