Belajar Python - Packaging, Distribution & PyPI
Episode 19 of 23

Belajar Python - Packaging, Distribution & PyPI

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.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

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.

Standar pyproject.toml

Deklarasi Lengkap Package

pyproject.toml sesuai PEP 621 adalah sumber kebenaran metadata:

pyproject.toml lengkap
[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.

Build Backend

setuptools: Paling Populer

setuptools adalah build backend paling luas pemakaiannya:

Install build
pip install build
Membangun dengan build
python3 -m build

python3 -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 sebagai Alternatif

Poetry dan Flit menyediakan backend alternatif:

Backend Poetry
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
Backend Flit
[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.

Membangun Wheels

Memahami Wheel dan sdist

Ada dua artefak yang dihasilkan build:

  • wheel (.whl): format biner siap install.
  • sdist (.tar.gz): source distribution untuk membangun ulang.

Wheel adalah format yang lebih cepat diinstall. Lihat isi dist setelah build:

Melihat hasil 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.

Menguji Package Lokal

Sebelum publish, uji package dari wheel yang dibangun:

Menginstall package dari wheel
python3 -m venv .venv-test
source .venv-test/bin/activate
pip install dist/belajar_utils-0.1.0-py3-none-any.whl

pip 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.

Publishing dengan twine

Persiapan Akun PyPI

Untuk publish, daftar di PyPI dan buat token API. Simpan token sebagai environment variable:

Menetapkan token PyPI
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.

Mengunggah ke PyPI

Unggah artefak dengan twine:

Install dan jalankan 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.

TestPyPI untuk Uji Coba

Uji upload ke TestPyPI dulu untuk menghindari kesalahan:

Upload ke TestPyPI
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.

Versioning dan Releases

Semantic Versioning

Gunakan semantic versioning dengan format MAJOR.MINOR.PATCH:

Format semantic versioning
MAJOR.MINOR.PATCH
1.4.2
  • MAJOR: perubahan yang tidak kompatibel ke belakang.
  • MINOR: penambahan fitur yang tetap kompatibel.
  • PATCH: perbaikan bug yang kompatibel.

Aturan ini membantu pengguna tahu seberapa besar risiko upgrade.

Menandai Releases di Git

Setiap release ditandai dengan tag Git:

Menandai release
git tag -a v0.1.0 -m "Rilis pertama belajar-utils"
git push origin v0.1.0

git 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.

Penutup

Inti yang harus dibawa pulang:

  • pyproject.toml sesuai PEP 621 mendeklarasikan semua metadata package.
  • Build backend: setuptools, Poetry, dan Flit menghasilkan artefak sama.
  • Wheel adalah format biner; sdist untuk source distribution.
  • Uji package dari wheel di venv bersih sebelum publish.
  • Twine mengunggah artefak ke PyPI dan TestPyPI.
  • Semantic versioning dan Git tag menandai release dengan jelas.

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!

Belajar Python - Packaging, Distribution & PyPI | Belajar Python