Artefak dist/ hasil Chapter Membangun Python Package bisa dipasang pip di komputer mana pun — tetapi hanya jika berkasnya sampai ke sana. Menempel berkas .whl di grup chat bukanlah distribusi; cara resminya adalah mengunggah package ke PyPI sehingga siapa pun bisa menjalankan pip install konverter-suhu. Pada chapter ini kita jalankan alur publikasi lengkap. Seluruh transkrip unggah pada chapter ini bersifat ilustratif — kita tidak benar-benar mengunggah apa pun, karena nama dan akun di PyPI milik pembuatnya sendiri.

Persiapan Sebelum Mengunggah #

Dua hal wajib dicek sebelum unggah pertama:

  • Ketersediaan nama. Distribution name bersifat unik dan sekali dipakai dimiliki pemiliknya selamanya. Cari nama kita di kolom pencarian pypi.org; jika sudah ada, ganti nama (misalnya konverter-suhu-budi). Chapter Memahami Python Packages menjelaskan bahwa nama inilah yang dipakai pada pip install, bukan import name.
  • Etika versioning. PyPI tidak pernah menimpa versi yang sudah ada — mengunggah 0.1.0 kedua kali ditolak dengan galat, apa pun isinya. Setiap rilis wajib menaikkan version di pyproject.toml, dan nomor versi sebaiknya mengikuti semantic versioning dari Chapter Dependency Pinning: naikkan PATCH untuk perbaikan, MINOR untuk fitur baru, MAJOR untuk perubahan yang merusak.

Latihan di TestPyPI #

TestPyPI (test.pypi.org) adalah instance PyPI khusus latihan dengan basis data terpisah — package di sana tidak muncul di PyPI sungguhan. Alur lengkapnya:

  1. Buat akun di test.pypi.org, lalu buat API token di halaman pengaturan akun dengan scope upload. Simpan token itu; contoh di sini memakai placeholder YOUR_TESTPYPI_TOKEN.
  2. Simpan kredensial di ~/.pypirc agar twine tidak menanyainya setiap kali unggah:
ini
[distutils]
index-servers =
    testpypi

[testpypi]
username = __token__
password = YOUR_TESTPYPI_TOKEN

Perhatikan nilainya: username bukan nama akun, melainkan teks khusus __token__, dan password adalah token itu sendiri.

  1. Unggah kedua artefak dari folder dist/:
bash
twine upload --repository testpypi dist/*

Output yang Dihasilkan (ilustratif):

text
Uploading konverter_suhu-0.1.0-py3-none-any.whl
100% ━━━━━━━━━━━━━━━━━━ 5.4/5.4 kB • 00:00:01 • 6.2 MB/s
Uploading konverter_suhu-0.1.0.tar.gz
100% ━━━━━━━━━━━━━━━━━━ 5.1/5.1 kB • 00:00:01 • 5.8 MB/s

View at:
https://test.pypi.org/project/konverter-suhu/0.1.0/
  1. Uji hasilnya seperti pengguna sungguhan — memasang dari TestPyPI dengan --index-url:
bash
pip install --index-url https://test.pypi.org/simple/ konverter-suhu

Jika langkah keempat berhasil, kemasan kita valid dari sisi pengguna. Jika gagal (misalnya README tidak ter-render atau dependency tidak terpasang), perbaiki, naikkan versi, bangun ulang, lalu unggah lagi.

Unggah ke PyPI #

Alur untuk PyPI produksi (pypi.org) identik: buat akun, aktifkan two-factor authentication, buat API token scope upload, lalu unggah tanpa flag --repository:

bash
twine upload dist/*

Output yang Dihasilkan (ilustratif):

text
Uploading konverter_suhu-0.1.0-py3-none-any.whl
100% ━━━━━━━━━━━━━━━━━━ 5.4/5.4 kB • 00:00:01 • 6.4 MB/s
Uploading konverter_suhu-0.1.0.tar.gz
100% ━━━━━━━━━━━━━━━━━━ 5.1/5.1 kB • 00:00:00 • 5.9 MB/s

View at:
https://pypi.org/project/konverter-suhu/0.1.0/

Mulai saat ini, siapa pun di dunia dapat menjalankan pip install konverter-suhu dan pip menemukannya di indeks default.

Setelah Terbit #

Rilis pertama baru separuh pekerjaan; pemeliharaan adalah separuh sisanya:

  • Perbaikan diunggah sebagai versi baru — perbaiki kode, naikkan version, jalankan python -m build, lalu twine upload dist/* seperti biasa.
  • Versi bermasalah dapat di-yank dari halaman rilis di PyPI: versi bertanda yanked disembunyikan dari resolusi normal, tetapi tetap terpasang bagi yang memintanya eksak dengan ==versi. Opsi ini untuk rilis rusak, bukan pengganti menghapus — PyPI tidak menghapus berkas yang sudah terunggah.
  • Trusted Publishing adalah alternatif modern tanpa token: proyek open source yang dibangun lewat GitHub Actions dapat meminta PyPI memverifikasi unggahan langsung dari alur kerja tertentu, menghapus risiko token bocor sepenuhnya.

Dengan package terpublikasi, siklus pengelolaan dependency kita kini menutup lingkaran penuh: kita pernah menjadi pengguna PyPI, dan kini menjadi penyumbangnya.