Package konverter-suhu pada Chapter Editable Install hanya hidup di komputer kita. Untuk membagikannya — ke rekan tim lewat shared drive, atau ke seluruh dunia lewat PyPI — kode dan metadata harus dikemas menjadi artefak standar yang bisa dipasang pip di mana saja. Pada chapter ini kita merapikan anatomi package, melengkapi metadata, lalu membangun dua artefak itu untuk nyata.
Anatomi Package dengan src Layout #
Struktur yang kita pakai disebut src layout — kode package berada di dalam folder src:
paket-demo/
├── pyproject.toml
├── README.md
└── src/
└── konverter_suhu/
└── __init__.pyTiga komponen tersebut punya peran masing-masing:
src/konverter_suhu/: package itu sendiri — folder bernama sama persis dengan import name (lihat aturan distribution name versus import name pada Chapter Memahami Python Packages).pyproject.toml: metadata dan konfigurasi build, standar PEP 621 dari Chapter pyproject.toml.README.md: deskripsi proyek yang akan menjadi halaman depan package di PyPI.
Mengapa menaruh kode di dalam src? Karena folder kerja secara default masuk sys.path (perilaku yang dibahas pada Chapter Module Search Path), layout datar membuat import konverter_suhu bisa lolos secara tidak sengaja meski package belum terpasang di venv. Dengan src layout, import hanya berhasil jika package benar-benar terpasang — sama seperti yang dialami pengguna package kita.
Melengkapi Metadata #
Chapter pyproject.toml sudah memperkenalkan tabel [project]; berikut versi lengkap yang benar-benar dipakai menulis 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"
readme = "README.md"
license = "MIT"
authors = [
{ name = "Budi Santoso", email = "[email protected]" },
]
requires-python = ">=3.10"
dependencies = []Dua kunci baru pantas ditekankan. readme = "README.md" menautkan berkas deskripsi — PyPI akan merender isinya sebagai halaman package. license = "MIT" memakai identifier SPDX, format yang disukai standar metadata modern, menggantikan tabel license = { file = "LICENSE" } gaya lama.
Membangun dengan python -m build #
Package build (yang kita pasang pada Chapter Menggunakan pip) menyediakan front-end standar. Dari dalam folder paket-demo:
python -m buildOutput yang Dihasilkan:
Successfully built konverter_suhu-0.1.0.tar.gz and konverter_suhu-0.1.0-py3-none-any.whlPerintah ini menghasilkan dua berkas di folder dist/:
dist/
├── konverter_suhu-0.1.0-py3-none-any.whl
└── konverter_suhu-0.1.0.tar.gzDi balik layar, python -m build membuat environment terisolasi, memasang backend yang dideklarasikan di [build-system] (setuptools), lalu meminta backend menghasilkan artefak. Perhatikan nama file wheel-nya: konverter_suhu-0.1.0-py3-none-any.whl. Segmen py3-none-any adalah tag yang menyatakan wheel berisi kode Python murni untuk semua versi Python 3 di semua platform — wheel berisi ekstensi C akan membawa tag seperti cp312-linux_x86_64 yang jauh lebih sempit.
sdist versus wheel #
Kedua artefak itu melayani kebutuhan berbeda:
| Aspek | sdist (.tar.gz) | wheel (.whl) |
|---|---|---|
| Isi | kode sumber lengkap plus metadata | package terkemas siap pasang (struktur ZIP dengan konvensi khusus) |
| Saat dipasang pip | dibangun dulu di mesin pengguna | diekstrak langsung tanpa proses build |
| Kapan dibutuhkan | pengguna ingin membangun/variasi sendiri | jalur cepat untuk instalasi sehari-hari |
| Nama berkas | konverter_suhu-0.1.0.tar.gz | konverter_suhu-0.1.0-py3-none-any.whl |
pip selalu memilih wheel bila tersedia dan kompatibel, karena pip tidak perlu menjalankan proses build di mesin pengguna. Wheel sebenarnya adalah arsip ZIP — unzip -l dist/konverter_suhu-0.1.0-py3-none-any.whl memperlihatkan isi seperti konverter_suhu/__init__.py dan berkas metadata konverter_suhu-0.1.0.dist-info/METADATA hasil render tabel [project].
Verifikasi Sebelum Distribusi #
Sebelum mengunggah, kemasan perlu diperiksa: apakah metadata-nya lengkap dan README akan ter-render benar. Alat standarnya adalah twine check (twine adalah tool unggah resmi yang kita pakai pada chapter berikutnya):
twine check dist/*Output yang Dihasilkan (ilustratif — twine tidak terpasang di lingkungan pengujian materi ini):
Checking dist/konverter_suhu-0.1.0-py3-none-any.whl: PASSED
Checking dist/konverter_suhu-0.1.0.tar.gz: PASSEDStatus PASSED berarti metadata valid dan PyPI akan menerima berkas tersebut. Dengan dua artefak yang lolos pemeriksaan, package kita siap didistribusikan — langkah yang menjadi fokus Chapter Mendistribusikan Python Package.