Episode ini membawa package kalian ke dunia: standar pyproject.toml, build backend seperti setuptools, Poetry, dan Flit, membangun wheels, publishing ke PyPI dengan twine, serta strategi versioning dan pengelolaan releases.

Membangun library yang bisa dipakai orang lain adalah pencapaian besar. Episode 19 mengajarkan packaging dan distribution: cara mendeklarasikan package dengan pyproject.toml, memilih build backend, membangun wheel, dan menerbitkannya ke PyPI.
Kita juga membahas versioning dan strategi release agar library kalian terkelola profesional. Di akhir episode, package kalian bisa diinstall dengan pip install nama-package oleh siapa pun di dunia.
pyproject.toml sesuai PEP 621 adalah sumber kebenaran metadata:
[build-system]
requires = ["setuptools>=68"]
build-backend = "setuptools.build_meta"
[project]
name = "belajar-utils"
version = "0.1.0"
description = "Library util untuk belajar packaging Python"
readme = "README.md"
requires-python = ">=3.12"
license = {text = "MIT"}
dependencies = ["requests>=2.31"]
[project.optional-dependencies]
dev = ["pytest>=8.0", "twine"][project] mendeklarasikan nama, versi, deskripsi, dan license. readme = "README.md" menunjuk dokumentasi. Bagian [project.optional-dependencies] memisahkan dependency dev. Struktur ini dibaca oleh semua build backend modern.
setuptools adalah build backend paling luas pemakaiannya:
pip install buildpython3 -m buildpython3 -m build membangun package memakai backend yang dideklarasikan di pyproject.toml. Outputnya berupa direktori dist/ berisi source distribution dan wheel. setuptools fleksibel untuk hampir semua struktur package.
Poetry dan Flit menyediakan backend alternatif:
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"[build-system]
requires = ["flit_core >=3.2,<4"]
build-backend = "flit_core.buildapi"Poetry memakai poetry.core.masonry.api dan Flit memakai flit_core.buildapi. Ketiganya menghasilkan artefak yang sama — wheel dan sdist. Pilih backend yang paling nyaman dengan workflow tim kalian.
Ada dua artefak yang dihasilkan build:
.whl): format biner siap install..tar.gz): source distribution untuk membangun ulang.Wheel adalah format yang lebih cepat diinstall. Lihat isi dist setelah build:
ls dist/ls dist/ menampilkan file seperti belajar_utils-0.1.0-py3-none-any.whl dan belajar-utils-0.1.0.tar.gz. Nama wheel menyandikan versi, tag Python, dan platform. Wheel py3-none-any artinya universal untuk Python 3 semua platform.
Sebelum publish, uji package dari wheel yang dibangun:
python3 -m venv .venv-test
source .venv-test/bin/activate
pip install dist/belajar_utils-0.1.0-py3-none-any.whlpip install dist/belajar_utils-0.1.0-py3-none-any.whl menginstall package dari wheel ke venv bersih. Uji import dan fungsinya di venv ini. Ini menjamin package tidak bergantung pada environment pengembangan kalian.
Untuk publish, daftar di PyPI dan buat token API. Simpan token sebagai environment variable:
export TWINE_USERNAME="__token__"
export TWINE_PASSWORD="pypi-TokenRahasiaAnda"export TWINE_USERNAME="__token__" menetapkan kredensial twine. PyPI modern memakai API token, bukan password akun. Jangan pernah menulis token di kode atau file yang ter-commit — ikuti best practice secret di episode 11.
Unggah artefak dengan twine:
pip install twine
twine check dist/*
twine upload dist/*twine check dist/* memverifikasi metadata sebelum upload. twine upload dist/* mengunggah wheel dan sdist ke PyPI. Setelah sukses, package bisa diinstall di mana saja dengan pip install belajar-utils.
Uji upload ke TestPyPI dulu untuk menghindari kesalahan:
twine upload --repository testpypi dist/*twine upload --repository testpypi dist/* mengunggah ke server uji. Setelah diuji di TestPyPI, publish ke PyPI resmi. Kebiasaan ini mencegah versi rusak atau metadata salah mendarat di index utama.
Gunakan semantic versioning dengan format MAJOR.MINOR.PATCH:
MAJOR.MINOR.PATCH
1.4.2Aturan ini membantu pengguna tahu seberapa besar risiko upgrade.
Setiap release ditandai dengan tag Git:
git tag -a v0.1.0 -m "Rilis pertama belajar-utils"
git push origin v0.1.0git tag -a v0.1.0 -m "Rilis pertama belajar-utils" menandai versi tertentu di history. Tag ini menjadi referensi untuk release notes dan bisa memicu pipeline publishing otomatis di episode 20. Release yang terkelola membuat library kalian mudah dimaintenance.
Inti yang harus dibawa pulang:
Di episode 20 selanjutnya kita akan membahas CI/CD, containerization, dan deployment — pipeline CI dengan GitHub Actions, caching dan matrix build untuk banyak versi Python, Docker multi-stage, menjalankan Gunicorn dan Uvicorn, serta target deployment seperti Cloud Run, AWS Lambda, dan Kubernetes. Aplikasi kalian siap meluncur ke production!