← Semua pembelajaran / Python untuk AI Engineer
Fase 0 · Setup Toolchain

uv — Working on projects

Halaman paling penting dari dokumentasi uv: bagaimana sebuah proyek Python modern dibentuk dan dijalankan sehari-hari.

Intisari

  • pyproject.toml = apa yang kamu minta. uv.lock = apa yang benar-benar dipakai. Commit keduanya.
  • uv add otomatis mengubah pyproject.toml, menyelesaikan lockfile, dan menyinkronkan .venv — tiga langkah jadi satu.
  • uv run selalu menyinkronkan environment dulu sebelum menjalankan. Jadi kodemu tidak pernah jalan di environment basi.
  • Dependency development (pytest, ruff) masuk grup terpisah lewat --dev — tidak ikut ter-install di production.
  • Di CI dan Docker pakai uv sync --frozen: gagal kalau lockfile tidak cocok, bukan diam-diam menyelesaikan ulang.

Membuat proyek

uv init proyek-saya
cd proyek-saya

uv init membuat kerangka minimal:

proyek-saya/
├── .python-version    # versi Python untuk proyek ini
├── README.md
├── main.py
└── pyproject.toml

Untuk proyek yang akan dipaketkan (punya src/), pakai flag --package:

uv init --package proyek-saya   # menghasilkan struktur src/proyek_saya/

Membaca pyproject.toml

[project]
name = "proyek-saya"
version = "0.1.0"
description = "Deskripsi singkat"
readme = "README.md"
requires-python = ">=3.13"        # batas bawah versi Python
dependencies = [                   # dependency runtime — ikut ke production
    "anthropic>=0.40",
    "httpx>=0.28",
]

[dependency-groups]
dev = [                            # hanya untuk ngoding — TIDAK ikut ke production
    "pytest>=8.0",
    "mypy>=1.14",
]

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

Tiga bagian yang perlu kamu pahami:

Siklus harian

1. Menambah dan menghapus dependency

uv add anthropic                  # tambah ke [project.dependencies]
uv add --dev pytest ruff mypy     # tambah ke grup dev
uv add "httpx>=0.28,<0.29"        # dengan batas versi eksplisit
uv add git+https://github.com/user/repo   # langsung dari git
uv remove anthropic

Satu perintah uv add melakukan tiga hal sekaligus:

  1. Menulis baris baru ke pyproject.toml
  2. Menyelesaikan seluruh graf dependency dan memperbarui uv.lock
  3. Menyinkronkan .venv supaya cocok dengan lockfile

2. Menjalankan kode

uv run main.py
uv run python -c "import anthropic; print(anthropic.__version__)"
uv run pytest
uv run uvicorn app:app --reload

Poin kunci: uv run selalu menyinkronkan environment lebih dulu. Kalau rekanmu menambah dependency dan kamu git pull, perintah uv run berikutnya otomatis memasangnya. Tidak ada lagi bug "jalan di komputerku, error di komputermu" karena venv basi.

3. Menyinkronkan manual

uv sync                  # samakan .venv dengan uv.lock
uv sync --frozen         # sama, tapi ERROR kalau lockfile tidak sinkron dengan pyproject.toml
uv sync --no-dev         # hanya dependency runtime — untuk image production
uv sync --all-groups     # semua grup dependency

--frozen adalah flag yang kamu pakai di CI dan Dockerfile. Tanpa itu, uv boleh menyelesaikan ulang dependency diam-diam — artinya build di CI bisa memakai versi berbeda dari yang kamu uji di laptop. Dengan --frozen, ketidakcocokan jadi error yang terlihat.

4. Menaikkan versi

uv lock --upgrade                # naikkan semua, dalam batas pyproject.toml
uv lock --upgrade-package httpx  # naikkan satu package saja
uv sync                          # terapkan ke .venv

Apa yang di-commit ke git

File / folderCommit?Alasan
pyproject.toml✅ YaDeklarasi proyek
uv.lock✅ YaMenjamin semua orang dapat versi persis sama
.python-version✅ YaMenyamakan versi interpreter tim
.venv/❌ TidakBisa dibangun ulang dari lockfile; besar & spesifik OS

Menjalankan script satu file

Untuk script kecil yang butuh dependency tapi tidak layak jadi proyek penuh, uv mendukung metadata inline (PEP 723) — dependency ditulis di dalam file script itu sendiri:

uv add --script analisa.py httpx
# /// script
# requires-python = ">=3.13"
# dependencies = ["httpx"]
# ///

import httpx
print(httpx.get("https://example.com").status_code)
uv run analisa.py    # uv baca blok metadata, siapkan env sementara, jalankan

Sangat berguna untuk script utilitas — bisa dikirim ke orang lain sebagai satu file yang langsung jalan.

Ringkasan perintah

PerintahFungsiKapan dipakai
uv initBikin proyek baruSekali di awal
uv add / removeUbah dependencySaat butuh library baru
uv runJalankan sesuatu di env proyekPuluhan kali sehari
uv syncSamakan venv dengan lockfileSetelah git pull, di CI
uv lock --upgradeNaikkan versi dependencyBerkala, sengaja
uvxJalankan tool tanpa installLint, format, cek tipe

Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.