18 poin oleh darjeeling 2025-11-09 | Belum ada komentar. | Bagikan ke WhatsApp

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.

  1. Dependensi bersama dan satu virtual environment

    • Anda dapat mendefinisikan dependensi bersama di file pyproject.toml pada 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.
  2. Berbagi kode melalui paket internal

    • Kode umum yang berulang (misalnya fungsi fetch_headlines) dapat dipisahkan ke dalam “paket internal” terpisah seperti core.
    • Melalui konfigurasi workspace, paket core ini 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.

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 ke pyproject.toml root.
  • Dependensi individual: Dependensi yang hanya dipakai oleh aplikasi tertentu (misalnya api) seperti fastapi dan uvicorn, ditambahkan ke pyproject.toml aplikasi tersebut (misalnya packages/api/pyproject.toml).
  • Saat uv sync dijalankan dari folder root, UV memindai semua pyproject.toml dan memasang seluruh dependensi yang diperlukan ke virtual environment root.

Langkah 3: Berbagi kode dengan paket internal

  1. Buat paket (folder) baru untuk menampung kode bersama, seperti packages/core.
  2. Tambahkan paket ini ke pyproject.toml root seperti dependensi biasa.
  3. Tambahkan bagian [tool.uv.sources] ke pyproject.toml root agar paket core dicari di dalam workspace, bukan dari PyPI.
<!-- end list -->
[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 }  
  1. Jalankan lagi uv sync, maka paket core akan dipasang dari sumber lokal.
  2. Sekarang di packages/api atau packages/cli, Anda bisa memanggil kode bersama dengan sintaks from 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.

Belum ada komentar.