Mengelola monorepo Python dengan UV Workspaces
(secondb.ai)Ringkasan pengelolaan monorepo Python dengan UV Workspaces
Video ini memperkenalkan cara merapikan dan menyelesaikan berbagai masalah yang muncul saat mengelola beberapa aplikasi Python (monorepo) dalam satu repositori Git menggunakan fitur UV Workspaces.
1. Ringkasan video
Permasalahan
Saat mengembangkan tool CLI dan aplikasi FastAPI secara bersamaan dalam satu repositori, masalah berikut dapat muncul.
- Duplikasi kode: Fitur yang digunakan bersama oleh CLI dan API (misalnya fungsi crawling headline) harus di-copy-paste.
- Pengelolaan environment yang rumit: Karena setiap aplikasi harus mengelola virtual environment terpisah, versi dependensi bisa bentrok atau ruang disk terbuang.
Solusi: UV Workspaces
UV Workspaces menyediakan dua fungsi inti untuk menyelesaikan masalah-masalah ini.
-
Dependensi bersama dan satu virtual environment
- Anda dapat mendefinisikan dependensi bersama di file
pyproject.tomlpada root proyek (tingkat teratas). - Saat menjalankan perintah
uv sync, UV membaca file konfigurasi ini dan membuat satu virtual environment bersama (.venv) di folder root untuk seluruh repositori. - Dengan begitu, semua subproyek (CLI, API, dan lain-lain) berbagi environment dan dependensi yang sama, sehingga bentrokan versi dapat dicegah dan pengelolaan menjadi lebih mudah.
- Anda dapat mendefinisikan dependensi bersama di file
-
Berbagi kode melalui paket internal
- Kode umum yang berulang (misalnya fungsi
fetch_headlines) dapat dipisahkan ke dalam “paket internal” terpisah seperticore. - Melalui konfigurasi workspace, paket
coreini dikenali sebagai sumber lokal, bukan dari PyPI. - Kini aplikasi CLI dan API dapat mengimpor dan menggunakan ulang kode bersama ini dengan
from core.news import fetch_headlines.
- Kode umum yang berulang (misalnya fungsi
2. Cara menggunakan UV Workspaces
Langkah 1: Konfigurasi workspace
Buat file pyproject.toml di folder root proyek, lalu definisikan bagian [tool.uv.workspace] untuk memberi tahu lokasi subproyek.
[tool.uv.workspace]
# Mengenali semua subfolder di dalam folder "packages" sebagai member workspace
members = ["packages/*"]
Langkah 2: Mengelola dependensi
- Dependensi bersama: Dependensi yang digunakan bersama oleh semua proyek (misalnya
python-dotenv) ditambahkan kepyproject.tomlroot. - Dependensi individual: Dependensi yang hanya dipakai oleh aplikasi tertentu (misalnya
api) sepertifastapidanuvicorn, ditambahkan kepyproject.tomlaplikasi tersebut (misalnyapackages/api/pyproject.toml). - Saat
uv syncdijalankan dari folder root, UV memindai semuapyproject.tomldan memasang seluruh dependensi yang diperlukan ke virtual environment root.
Langkah 3: Berbagi kode dengan paket internal
- Buat paket (folder) baru untuk menampung kode bersama, seperti
packages/core. - Tambahkan paket ini ke
pyproject.tomlroot seperti dependensi biasa. - Tambahkan bagian
[tool.uv.sources]kepyproject.tomlroot agar paketcoredicari di dalam workspace, bukan dari PyPI.
[project]
# 1. Tambahkan paket internal sebagai dependensi
dependencies = [
"core",
"python-dotenv"
]
# 2. Menandai bahwa 'core' adalah paket workspace lokal
[tool.uv.sources]
core = { workspace = true }
- Jalankan lagi
uv sync, maka paketcoreakan dipasang dari sumber lokal. - Sekarang di
packages/apiataupackages/cli, Anda bisa memanggil kode bersama dengan sintaksfrom core.news import ....
Langkah 4: Menjalankan proyek
Saat menjalankan proyek tertentu, gunakan uv run --from <nama-paket>.
# Menjalankan server API
uv run --from packages/api uvicorn main:app --reload
# Menjalankan tool CLI
uv run --from packages/cli python main.py
3. Siapa yang cocok menggunakannya
- Saat mengelola beberapa skrip otomatisasi kecil, webhook, API, CLI, dan sebagainya dalam satu repositori.
- Sangat berguna jika aplikasi-aplikasi tersebut berbagi logika atau dependensi yang sama.
- Sebaliknya, ini mungkin kurang cocok untuk skrip tunggal, paket yang akan didistribusikan secara independen ke PyPI, atau aplikasi yang sama sekali tidak saling terkait.
Tautan video asli: https://www.youtube.com/watch?v=N_ypJwV8Q8I
Belum ada komentar.