Proyek yang berfungsi pada direktori kerja belum tentu siap dipakai orang lain. Topik ini menutup proyek suhu dengan tiga pekerjaan rilis, yaitu membungkusnya sebagai paket nimble, membangun biner rilis yang dioptimasi, dan menyempurnakan README sehingga pengguna baru dapat menjalankannya sendiri. Seluruh berkas sumber proyek dibawa tanpa perubahan dari tahap pembangunan, sehingga fokus di sini sepenuhnya pada pengemasan dan publikasi.
Berkas paket nimble#
Paket nimble didefinisikan oleh satu berkas yang namanya harus sama dengan nama paket, yaitu suhu.nimble untuk paket bernama suhu. Berkas ini menetapkan identitas paket, dependensinya, biner yang dihasilkan, serta tugas tambahan seperti pengujian:
# Package
version = "0.1.0"
author = "Budi"
description = "Alat CLI statistik catatan suhu berformat CSV"
license = "MIT"
# Dependencies
requires "nim >= 2.4.0"
# Build
bin = @["suhu"]
# Tugas
task test, "menjalankan seluruh pengujian":
selfExec "c -r --hints:off tes_parser"
selfExec "c -r --hints:off tes_statistik"Kunci bin menyatakan biner yang dibangun nimble, sedangkan requires menyatakan syarat versi, dan dalam kasus ini cukup Nim 2.4.0 karena proyeknya tidak memakai paket pihak ketiga. Tugas test memanggil selfExec, yaitu perintah yang menjalankan compiler dengan konfigurasi nimble, sehingga pengguna paket tidak perlu tahu nama-nama berkas tesnya. Nama berkas paket wajib sama dengan nama paketnya karena nimble mengenali paket dari berkas .nimble yang ditemuinya, bukan dari kunci di dalamnya. Nimble sendiri adalah pengelola paket resmi ekosistem Nim, yaitu alat yang memasang paket dari daftar resmi beserta dependensinya, dan nomor versi paket dinyatakan hanya di berkas ini. Struktur lengkap direktori proyek pada tahap ini adalah sebagai berikut:
suhu/
├── README.md
├── suhu.nimble
├── suhu.nim
├── parser.nim
├── statistik.nim
├── tes_parser.nim
├── tes_statistik.nim
└── suhu.csvPembangunan dan pengujian lewat nimble#
Dengan berkas paket tersedia, pembangunan dan pengujian berpindah ke nimble. Perintah nimble build membaca suhu.nimble, memeriksa dependensi, lalu mengompilasi seluruh entri pada kunci bin dengan konfigurasi nimble, dan biner yang dihasilkan bernama sama dengan entrinya, yaitu suhu:
# membangun paket lewat nimble
nimble build Info: using /home/kal/my-project/tools/nim-2.4.0/bin/nim for compilation
Building suhu/suhu using c backendBaris Info pada keluaran menunjukkan compiler yang dipakai nimble, sehingga perbedaan versi antar lingkungan mudah dideteksi. Pengembang tetap bebas memanggil nim c secara langsung selama pengembangan harian, sedangkan nimble menjadi lapisan yang seragam bagi pengguna paket. Kombinasi keduanya, yaitu nimble untuk pengguna dan nim c untuk pengembang, lazim pada proyek Nim kecil maupun besar, dan keduanya memakai berkas sumber yang sama tanpa penyetelan ulang.
Perintah nimble test menjalankan tugas test yang barusan didefinisikan, sehingga dua berkas tes dijalankan berurutan dalam satu perintah:
# menjalankan seluruh tes lewat tugas paket
nimble test Info: using /home/kal/my-project/tools/nim-2.4.0/bin/nim for compilation
Executing task test in /home/kal/my-project/content/nim/pengerjaan-proyek/rilis/suhu.nimble
[Suite] urai baris
[OK] baris lengkap
[OK] spasi sebelum angka diabaikan
[OK] kolom suhu bukan angka memunculkan ValueError
[Suite] urai csv
[OK] header dan baris kosong dilewati
[OK] kolom kurang dari dua memunculkan ValueError
[Suite] statistik deret
[OK] minimum dan maksimum
[OK] rata-rata tiga nilai
[OK] median dengan banyak data ganjil
[OK] median dengan banyak data genapSembilan tes pada tiga suite semuanya lulus, dan keluaran tersebut menjadi bukti rilis yang dapat disertakan pada pengumuman versi. Sejak titik ini, pengguna paket tidak perlu mengetahui detail kompilasi, cukup nimble build dan nimble test.
Biner rilis#
Biner bawaan hasil nim c belum dioptimasi, sehingga biner yang dibagikan dibangun ulang dengan dua sakelar, yaitu -d:release yang mengaktifkan optimasi dan menonaktifkan pemeriksaan runtime yang mahal, serta --opt:speed yang menyetel optimasinya ke kecepatan:
# membangun biner rilis dengan optimasi
nim c -d:release --opt:speed --hints:off -o:suhu-rilis suhu.nim
# memeriksa status simbol dan ukuran berkas
file suhu-rilis | grep -o "not stripped"
wc -c < suhu-rilisnot stripped
109104Hasilnya berukuran 109.104 byte dan masih membawa simbol debug, yaitu tabel nama fungsi dan variabel yang dipakai alat debugger. Simbol tersebut tidak diperlukan pada biner yang dibagikan, sehingga dilepas dengan strip:
# membuang simbol debug dari biner rilis
strip suhu-rilis
# memeriksa ulang status simbol dan ukurannya
file suhu-rilis | grep -o "stripped"
wc -c < suhu-rilisstripped
93080Pembuangan simbol mengecilkan biner menjadi 93.080 byte tanpa mengubah perilakunya, dan file kini melaporkannya sebagai stripped. Sakelar -d:release sendiri mengubah perilaku program, yaitu banyak pemeriksaan runtime yang mahal dinonaktifkan dan optimizer compiler diaktifkan, sehingga hasilnya lebih cepat. Karena perbedaan perilaku itulah biner rilis selalu diuji ulang setelah dibangun, seperti dilakukan di bawah, dan tidak sekadar disalin dari biner pengembangan. Pada lingkungan yang sama, pembangunan ulang dengan compiler serta sakelar yang sama menghasilkan biner yang identik, sebuah sifat yang memudahkan penelusuran bug pada versi tertentu. Biner rilis diuji sekali lagi untuk memastikan laporannya tetap benar setelah optimasi:
# menguji biner rilis dengan berkas data
./suhu-rilis suhu.csvBerkas : suhu.csv
Banyak data : 10
Suhu minimum : 20.50
Suhu maksimum: 24.00
Rata-rata : 22.22
Median : 22.20README yang lengkap#
README adalah muka paket, dan isi yang baik menjawab empat pertanyaan pengguna baru dalam satu tarikan napas, yaitu program ini apa, cara memakainya, keluarannya seperti apa, dan cara membangunnya. Berkas README.md proyek suhu berikut mengikuti pola tersebut, dan setiap keluaran di dalamnya disalin dari eksekusi nyata:
# suhu
Alat baris perintah untuk menghitung statistik deskriptif dari berkas CSV
catatan suhu. Program ini ditulis dalam Nim tanpa dependensi eksternal.
## Pemakaian
```text
suhu <berkas.csv>
```
Berkas CSV harus memiliki baris header `tanggal,suhu` dan satu catatan
per baris.
## Contoh
Dengan berkas `suhu.csv` berisi sepuluh catatan harian:
```text
Berkas : suhu.csv
Banyak data : 10
Suhu minimum : 20.50
Suhu maksimum: 24.00
Rata-rata : 22.22
Median : 22.20
```
## Membangun
```bash
nim c -d:release --opt:speed suhu.nim
```
## Pengujian
```bash
nimble test
```
## Struktur
- `suhu.nim` : titik masuk program dan penyusunan laporan
- `parser.nim` : penguraian berkas CSV
- `statistik.nim` : perhitungan statistik deskriptif
## Lisensi
MITBagian contoh adalah yang paling sering diabaikan, padahal keluaran nyata memberi pembaca patokan yang bisa dibandingkan dengan sistemnya sendiri. Urutan bagiannya juga disengaja, yaitu pemakaian lebih dahulu, contoh keluaran berikutnya, lalu petunjuk membangun, karena itulah urutan pertanyaan yang alami dari pengguna baru. Nama proyek pada judulnya disamakan dengan nama paket nimble agar pencarian antar keduanya konsisten. Lisensi juga dicantumkan eksplisit karena paket tanpa lisensi tidak dapat dipakai aman oleh pihak lain, dan MIT pada proyek ini dipilih karena bentuknya pendek serta mengizinkan pemakaian luas.
Mempublikasikan paket#
Publikasi membuat paket dapat dipasang oleh siapa pun dengan satu perintah nimble install suhu. Cara resminya adalah mengunggah proyek ke repository publik, lalu mendaftarkannya pada daftar paket resmi nimble, yang dikelola pada repository nim-lang/packages berisi berkas packages.json. Langkah-langkahnya memerlukan repository remote dan akun hosting Git, sehingga tidak dapat dieksekusi penuh di lingkungan sandbox ini:
# tidak-dijalankan: butuh repository remote dan akun hosting Git
# menginisialisasi repository proyek dan merekam seluruh berkas sumber
git init
git add README.md suhu.nimble suhu.nim parser.nim statistik.nim tes_parser.nim tes_statistik.nim
git commit -m "Rilis suhu 0.1.0"
# menandai versi agar sama dengan versi pada suhu.nimble
git tag v0.1.0
# mengunggah ke repository publik, misalnya GitHub
git push origin main --tagsSetelah repositorynya publik, paket didaftarkan dengan menambahkan satu entri ke packages.json melalui pull request, berisi nama, url repository, deskripsi, dan daftar tag. Daftar resmi itu disimpan sebagai satu berkas JSON yang disunting melalui pull request, sehingga setiap paket baru melewati pemeriksaan manusia sebelum terdaftar. Ketika pull request itu digabungkan, nimble install suhu sudah berfungsi bagi semua pengguna nimble, dan pembaruan versi berikutnya cukup dengan menaikkan kunci version, membuat tag baru, lalu memperbarui entri paketnya.
Kesalahan umum#
- Membagikan biner tanpa
-d:release. Biner pengembangan bekerja dengan benar, tetapi performanya tertinggal jauh dari biner rilis. Perbaikannya adalah membangun ulang dengan-d:release --opt:speed, lalu mengujinya sekali lagi sebelum dibagikan. - README tanpa contoh keluaran. Penjelasan yang hanya berisi daftar fitur tidak memberi patokan apa pun kepada pengguna baru. Perbaikannya adalah menyertakan keluaran asli pada contoh, persis seperti bagian contoh README di atas.
- Versi nimble dan tag Git yang tidak sinkron. Pengguna yang menelusuri bug pada versi tertentu akan salah membaca riwayat kode. Perbaikannya adalah menaikkan kunci
versiondan membuat tag dalam satu langkah kerja yang sama. - Membagikan isi berbeda dengan nomor versi sama. Pengguna yang sudah memasang versi lama tidak dapat membedakannya dari versi baru yang belum diberi nomor naik. Perbaikannya adalah menaikkan nomor versi pada setiap perubahan yang dibagikan, sekecil apa pun perubahannya, dan menyesuaikan tag Git-nya sekaligus.
Ringkasan#
- Paket nimble didefinisikan pada
suhu.nimbleyang memuat identitas, dependensi, kuncibin, dan tugastestyang menjalankan dua berkas tes. nimble builddannimble testmenjadi antarmuka baku pembangunan dan pengujian bagi pengguna paket.- Biner rilis dibangun dengan
-d:release --opt:speedlalu dihapus simbolnya denganstrip, memperkecil ukurannya dari 109.104 menjadi 93.080 byte tanpa mengubah perilaku. - Publikasi resmi mengunggah repository beserta tag versi, lalu mendaftarkan paket pada
packages.jsondi repositorynim-lang/packagesmelalui pull request.
Referensi#
- nim-lang/nimble — GitHub — Repository resmi nimble yang mencakup format berkas paket, tugas, dan perintah build serta test.
- nim-lang/packages — GitHub — Repository daftar paket resmi nimble yang diperbarui melalui pull request.
- Nim Compiler User Guide — Nim documentation
— Panduan sakelar compiler seperti
-d:releasedan--opt:speedyang dipakai pada biner rilis.