Kita kini punya bekal membangun package sendiri: metadata pyproject.toml dari Chapter pyproject.toml dan struktur yang akan dirinci pada Chapter Membangun Python Package. Bayangkan siklus pengembangannya: ubah satu baris kode, jalankan pip install . untuk memasukkan perubahan ke venv, uji, ulangi. Setiap iterasi menunggu proses salin-menyalin. Perintah pip install -e . (editable install) memangkas siklus itu menjadi nol: perubahan kode langsung terlihat tanpa instalasi ulang.
Cara Kerja Editable Install #
Instalasi normal menyalin kode package ke dalam site-packages. Editable install melakukan hal yang berbeda: pip membiarkan kode tetap di folder sumbernya dan hanya menulis satu berkas kecil bertipe .pth di site-packages. Berkas tersebut berisi satu baris — jalur folder package kita:
/home/budi/paket-demo/srcSaat interpreter Python memulai sesi, setiap berkas .pth di site-packages dibaca dan jalur di dalamnya ditambahkan ke sys.path. Akibatnya, statement import konverter_suhu menemukan kode langsung di folder sumber — kode yang sedang kita edit. Tidak ada penyalinan kode; yang disalin hanyalah alamatnya.
Demo Lengkap dari Awal #
Mari kita buktikan dengan package konverter-suhu. Struktur dan metadata minimalnya:
paket-demo/
├── pyproject.toml
└── src/
└── konverter_suhu/
└── __init__.pyBerkas pyproject.toml inilah yang benar-benar dipakai penulis saat menguji chapter ini:
[build-system]
requires = ["setuptools>=61"]
build-backend = "setuptools.build_meta"
[project]
name = "konverter-suhu"
version = "0.1.0"
description = "Contoh package Python untuk mengonversi suhu"
requires-python = ">=3.10"Isi __init__.py — satu function konversi suhu:
"""Package contoh untuk konversi suhu."""
def celsius_ke_fahrenheit(celsius: float) -> float:
"""Konversi suhu dari Celsius ke Fahrenheit."""
return celsius * 9 / 5 + 32Dari dalam folder paket-demo, pasang package dalam mode editable (pastikan venv proyek sedang aktif):
pip install -e .Output yang Dihasilkan:
Successfully installed konverter-suhu-0.1.0Sekarang uji dari direktori mana pun di luar paket-demo:
python3 -c "from konverter_suhu import celsius_ke_fahrenheit; print(celsius_ke_fahrenheit(100))"Output yang Dihasilkan:
212.0Package terpasang dan berfungsi. Berikut momen kuncinya: tambahkan function baru ke __init__.py —
def fahrenheit_ke_celsius(fahrenheit: float) -> float:
"""Konversi suhu dari Fahrenheit ke Celsius."""
return (fahrenheit - 32) * 5 / 9Simpan berkas, lalu jalankan kode uji tanpa menjalankan pip install -e . lagi:
python3 -c "import konverter_suhu; print(konverter_suhu.fahrenheit_ke_celsius(212))"Output yang Dihasilkan:
100.0Function baru langsung tersedia. Karena import membaca kode dari folder sumber melalui jalur di berkas .pth, setiap penyimpanan berkas adalah “instalasi” baru.
Jejak Editable Install pada Metadata #
pip tetap mencatat editable install sebagai package biasa, dengan satu penanda tambahan. Output pip show konverter-suhu (jalur pada Location dan Editable project location akan berbeda di komputer Anda):
Name: konverter-suhu
Version: 0.1.0
Summary: Contoh package Python untuk mengonversi suhu
Home-page:
Author:
Author-email:
License:
Location: /home/budi/proyek-toko/.venv/lib/python3.12/site-packages
Editable project location: /home/budi/paket-demo
Requires:
Required-by: Baris Editable project location mengungkap mekanismenya: metadata package tinggal di site-packages, sedangkan kode hidup di folder proyek. Perintah pip freeze juga menandainya dengan baris -e /home/budi/paket-demo alih-alih nama==versi.
Kapan Memakainya #
Dua mode instalasi ini berdampingan dengan peran berbeda:
| Aspek | pip install . (normal) | pip install -e . (editable) |
|---|---|---|
| Lokasi kode yang diimpor | salinan di site-packages | folder sumber asli |
| Perubahan kode terlihat setelah | instalasi ulang | langsung, saat berkas disimpan |
| Cocok untuk | memakai package versi tetap | mengembangkan package itu sendiri |
pip freeze menuliskannya sebagai | konverter-suhu==0.1.0 | -e /jalur/ke/paket-demo |
Editable install dirancang untuk dua situasi: saat mengembangkan package sendiri (siklus edit-uji instan, seperti demo di atas) dan saat memakai tool internal tim yang ingin selalu mengikuti branch pengembangan. Untuk dependency pihak ketiga biasa, instalasi normal dari PyPI tetap lebih tepat — kode yang berubah sendiri di belakang layar bukan sesuatu yang kita inginkan dari dependency eksternal.