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:

text
/home/budi/paket-demo/src

Saat 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:

text
paket-demo/
├── pyproject.toml
└── src/
    └── konverter_suhu/
        └── __init__.py

Berkas pyproject.toml inilah yang benar-benar dipakai penulis saat menguji chapter ini:

toml
[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:

python
"""Package contoh untuk konversi suhu."""


def celsius_ke_fahrenheit(celsius: float) -> float:
    """Konversi suhu dari Celsius ke Fahrenheit."""
    return celsius * 9 / 5 + 32

Dari dalam folder paket-demo, pasang package dalam mode editable (pastikan venv proyek sedang aktif):

bash
pip install -e .

Output yang Dihasilkan:

text
Successfully installed konverter-suhu-0.1.0

Sekarang uji dari direktori mana pun di luar paket-demo:

bash
python3 -c "from konverter_suhu import celsius_ke_fahrenheit; print(celsius_ke_fahrenheit(100))"

Output yang Dihasilkan:

text
212.0

Package terpasang dan berfungsi. Berikut momen kuncinya: tambahkan function baru ke __init__.py —

python
def fahrenheit_ke_celsius(fahrenheit: float) -> float:
    """Konversi suhu dari Fahrenheit ke Celsius."""
    return (fahrenheit - 32) * 5 / 9

Simpan berkas, lalu jalankan kode uji tanpa menjalankan pip install -e . lagi:

bash
python3 -c "import konverter_suhu; print(konverter_suhu.fahrenheit_ke_celsius(212))"

Output yang Dihasilkan:

text
100.0

Function 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):

text
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:

Aspekpip install . (normal)pip install -e . (editable)
Lokasi kode yang diimporsalinan di site-packagesfolder sumber asli
Perubahan kode terlihat setelahinstalasi ulanglangsung, saat berkas disimpan
Cocok untukmemakai package versi tetapmengembangkan package itu sendiri
pip freeze menuliskannya sebagaikonverter-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.