Mendistribusikan skrip Anda sendiri lewat Homebrew
(justin.searls.co)- Homebrew adalah package manager di macOS yang memudahkan instalasi dan pengelolaan alat CLI, sehingga developer dapat menyiapkan lingkungan sistem secara efisien dengan alat yang sering mereka gunakan
- Panduan ini menjelaskan proses mendistribusikan skrip CLI pribadi dengan Homebrew, serta menunjukkan cara menyederhanakan pemeliharaan melalui integrasi GitHub dan alur kerja otomatis
- Proses distribusinya mengikuti alur membuat CLI → rilis GitHub → membuat Tap → menulis dan memperbarui Formula, dan pada akhirnya dapat diinstal hanya dengan perintah
brew tapdanbrew install - Dengan memahami sistem istilah dan best practice Homebrew, Anda dapat melakukan distribusi yang stabil dengan reproduktibilitas dan keamanan rantai pasok yang lebih kuat
- Ini juga dapat diotomatisasi melalui workflow GitHub Actions, dan setelah sekali disiapkan, distribusi CLI lain berikutnya menjadi jauh lebih mudah
Latar belakang dan motivasi
- Homebrew adalah package manager pilihan untuk menginstal alat CLI dan digunakan oleh banyak developer
- Namun, banyak orang mendistribusikan CLI buatan mereka sendiri lewat npm atau RubyGem, sehingga cara distribusi via Homebrew bisa terasa asing
- Repositori core resmi Homebrew memiliki kebijakan bahwa tim Homebrew enggan menerima pendaftaran alat buatan sendiri, sehingga developer umum mendistribusikannya lewat tap dan formula terpisah
- Panduan ini dijelaskan berdasarkan pengalaman mendistribusikan CLI sederhana berbasis Ruby
Penjelasan istilah
- Homebrew menggunakan istilah khas yang mengikuti tema pembuatan bir, jadi memahaminya akan memudahkan Anda menangkap struktur sistemnya
- Formula adalah file definisi paket yang berisi instruksi untuk menginstal source code atau biner
- Tap adalah repositori Git untuk kumpulan Formula, digunakan untuk mengelola paket kustom per pengguna atau organisasi
- Cask adalah manifest instalasi untuk aplikasi GUI atau biner berukuran besar, mirip Formula tetapi menangani file yang sudah dibangun sebelumnya
- Bottle adalah bentuk paket biner prebuilt yang disalin tanpa membangun dari source, sehingga mempercepat instalasi
- Cellar adalah direktori tempat Formula yang sudah terinstal disimpan, misalnya pada path
/opt/homebrew/Cellar - Keg adalah direktori instance instalasi untuk Formula tertentu, ditempatkan per versi di dalam Cellar
Gambaran umum
- Repositori core Homebrew tidak menerima konten yang terlalu niche atau bersifat pribadi, sehingga pengguna harus membuat repositori tap terpisah untuk mendistribusikan CLI mereka
- 1. Buat CLI, unggah ke GitHub, lalu buat rilis bertag
- 2. Buat Tap dengan
brew tap-new, lalu push ke GitHub - 3. Tulis Formula dengan
brew create(termasuk URL tarball dan SHA256) - 4. Setiap ada rilis versi baru, perbarui Formula agar pengguna dapat menginstalnya dengan mudah lewat perintah
brew install
- Setelah distribusi selesai, pengguna dapat menginstal CLI hanya dengan dua perintah:
brew tap your_github_handle/tapdanbrew install your_cool_cli- Panduan ini tidak membahas pengembangan CLI, dan berfokus pada pembuatan tap, pembuatan Formula, serta proses pembaruan
- Sebagai contoh, digunakan CLI
imsgyang membuat arsip web interaktif dari database iMessage
Membuat tap
- Ikuti panduan pembuatan tap Homebrew, lalu sesuaikan dengan nama pengguna atau organisasi GitHub Anda
- Untuk mengumpulkan semua alat CLI ke dalam satu tap di masa mendatang, nama
homebrew-tapdirekomendasikan; awalanhomebrewdiperlakukan khusus oleh CLI dan awalantapadalah konvensi umum
- Untuk mengumpulkan semua alat CLI ke dalam satu tap di masa mendatang, nama
- Jalankan perintah pembuatan tap:
brew tap-new searlsco/homebrew-tap- Ini akan membuat scaffold di
/opt/homebrew/Library/Taps/searlsco/homebrew-tap - Buat repositori pasangannya di GitHub, lalu push hasil yang telah dibuat:
cd /opt/homebrew/Library/Taps/searlsco/homebrew-tap,git remote add origin git@github.com:searlsco/homebrew-tap.git,git push -u origin main
- Ini akan membuat scaffold di
- Setelah memiliki tap tersebut, pengguna lain bisa meng-clone repositorinya ke
/opt/homebrew/Library/Tapsdengan perintahbrew tap searlsco/tap- Pada awalnya belum ada isi yang berguna, tetapi perilaku dasarnya bisa dipastikan berjalan
Membuat Formula
- Homebrew bisa langsung merujuk ke repositori GitHub, tetapi menyarankan penggunaan tarball berversi dan checksum untuk memperkuat reproduktibilitas serta keamanan rantai pasok open source
- Saat tag didorong ke GitHub, GitHub akan meng-host tarball dengan URL yang dapat diprediksi; misalnya, setelah menjalankan
git tag v0.0.5,git push --tagsdi repositoriimsg, akan dibuathttps://github.com/searlsco/imsg/archive/refs/tags/v0.0.5.tar.gz
- Saat tag didorong ke GitHub, GitHub akan meng-host tarball dengan URL yang dapat diprediksi; misalnya, setelah menjalankan
- Perintah untuk membuat Formula:
brew create https://github.com/searlsco/imsg/archive/refs/tags/v0.0.5.tar.gz --tap searlsco/homebrew-tap --set-name imsg --ruby- Flag
--tapmenentukan tap kustom dan menempatkan Formula di/opt/homebrew/Library/Taps/searlsco/homebrew-tap/Formula --set-name imsgmenetapkan nama Formula secara eksplisit; pilih nama yang unik untuk menghindari duplikasi (misalnya, hati-hati agar tidak bentrok dengan CLI TLDR atau standard yang sudah ada)--rubyadalah preset template untuk Ruby CLI, salah satu dari beberapa opsi yang menyederhanakan kustomisasi
- Flag
- Formula yang dihasilkan mungkin belum langsung berfungsi, jadi gunakan LLM untuk memperbaikinya: jalankan
brew install --verbose imsg, lalu masukkan error ke ChatGPT dan ulangi pembaruan Formula- File akhir Formula/imsg.rb dapat disalin sebagai titik awal untuk distribusi Ruby CLI
- Dengan mendistribusikannya lewat Homebrew alih-alih package manager spesifik bahasa, upgrade di sisi pengguna tetap lancar meskipun bahasa implementasinya berubah
Sorotan utama Formula
- Semua Formula ditulis dalam Ruby, karena sebelum JavaScript atau AI populer, banyak alat pengembang ditulis berbasis Ruby
- Metode
headdapat digunakan untuk menentukan repositori Git, tetapi efek nyatanya tidak jelas - Menambahkan
livecheckbernilai karena memudahkan pembaruan versi Formula - Pengujian eksekusi biner bisa diimplementasikan secara sederhana dengan memeriksa output bantuan; jangan terintimidasi oleh komentar yang dihasilkan otomatis
- Gunakan perintah
brew style searlsco/tapuntuk memeriksa error gaya - Default
uses_from_macos "ruby"pada template--rubymemakai versi 2.6.10 (rilis sebelum COVID, EOL 3 tahun lalu), sehingga disarankan bergantung pada Formula ruby terbaru dengandepends_on "ruby@3"
- Metode
- Jika Formula sudah memuaskan, lakukan
git pushuntuk distribusi langsung, dan pengguna dapat menginstalnya denganbrew tap searlsco/tapsertabrew install imsg
Memperbarui Formula untuk setiap rilis CLI
urldan hashsha256di bagian atas Formula harus diperbarui manual pada setiap rilis, dan ini merepotkan; bahkan membuat tag push atau GitHub release pun terasa melelahkan- Perintah
bump-formula-prmilik Homebrew atau GitHub Actions bisa membuat PR, tetapi proses fork dan PR terasa tidak perlu rumit - Jika Anda pemilik tap, pendekatan yang lebih diinginkan adalah cara sederhana yang langsung commit ke branch main
- Perintah
- Untuk menghindari itu, disarankan menambahkan workflow GitHub ke repositori Formula agar tap diperbarui otomatis saat rilis
- Anda dapat menyalin dan menggunakan contoh workflow
- Konfigurasi yang diperlukan: saat membuat GitHub personal access token (PAT), beri izin
Content→Writepada repositorihomebrew-tap, lalu simpan di Secrets repositori Formula sebagaiHOMEBREW_TAP_TOKEN - Tentukan tap dan Formula melalui environment variable (misalnya, baris 13-15)
- Disarankan memperbarui akun bot GitHub:
GH_EMAIL: 41898282+github-actions[bot]@users.noreply.github.com,GH_NAME: github-actions[bot]
- Setelah rilis dibuat dan
git push --tagsdijalankan, pembaruan otomatis akan terjadi dalam beberapa detik, dan pengguna dapat melakukan upgrade denganbrew updatesertabrew upgrade imsg
Bagian terbaiknya
- Proses ini memang rumit, tetapi setelah pengaturan tap dan satu contoh Formula selesai, distribusi CLI tambahan menjadi nyaris sepele
- Sangat praktis karena Formula baru bisa dipublikasikan hanya dalam beberapa menit
- Proses resmi Homebrew memang agak kompleks, tetapi otomatisasi membuatnya lebih nyaman
- Ini mengurangi kerepotan antara rilis dan distribusi tiap alat, serta dapat diperluas untuk mendukung CLI dari berbagai bahasa
- Belum tentu akan benar-benar menerbitkan Formula lain lagi, tetapi menyenangkan mengetahui kemungkinannya terbuka
2 komentar
Tersedia opsi
--no-forksehingga Anda bisa langsung push branch dan melakukan merge, serta menyediakan fitur pembaruan otomatis.Opini Hacker News
Aturan penamaan Homebrew kadang terasa membingungkan, tetapi secara keseluruhan saya terus merasa ini benar-benar alat yang sangat berguna
Saya juga tidak menyangka proses membuat tap sendiri untuk mendistribusikan tool bisa sesederhana ini
Dibandingkan package manager per bahasa (misalnya uv), saya penasaran apa kelebihannya
Secara khusus, saya ingin tahu apakah ini lebih mudah bagi orang yang tidak berada di dalam ekosistem tertentu, yaitu apakah unggul dari sudut pandang keumuman
Terima kasih, alat lain yang memakai package registry umumnya memerlukan pembuatan akun, autentikasi dua faktor, proses penandatanganan, dan sebagainya
Homebrew jauh lebih sederhana secara keseluruhan karena ketentuan layanan GitHub (ToS) berperan sebagai dasar kepercayaan
Tim Homebrew juga bisa mengurangi banyak kerumitan berkat pendekatan ini
Jika bicara berdasarkan paket Python, upaya untuk memaketkan semuanya sekaligus seperti uv secara realistis cukup sulit
Karena itu, biasanya yang dipakai adalah pendekatan menginstal hanya dependensi yang dikunci di lingkungan venv
Sebagai contoh konkret, lihat formula ini
Soal uv, saya sempat mencoba mendukung paket privat dengan tool resmi (
brew update-python-resources,homebrew-pypi-poet), tetapi tidak berjalan dengan baikJadi saya membuat sendiri uvbrew untuk membantu pembuatan resource
Ada juga dokumentasi resmi untuk referensi menulis formula Python di Homebrew
Jika Anda pengembang Go, saya merekomendasikan tool Goreleaser
Ini membuat distribusi biner di dalam tap pribadi menjadi sangat mudah (cara ini dilarang di core resmi)
Ini sangat berguna dalam pengelolaan proyek lintas bahasa
Secara pribadi, saya pikir lebih ideal jika pembaruan dikelola langsung dari sisi tap
Umumnya mirip dengan cara upstream melakukan pembaruan
Jika melihat workflow ini, formula/cask yang tidak Anda miliki pun bisa diperbarui dengan mudah
Dengan perintah
brew bump, Anda bisa memindai semuanya, membuat PR, lalu mengotomatiskan pengujian denganbrew test-botContoh PR nyata bisa dilihat di sini
Biasanya saya enggan mencobanya karena merasa sayang dengan waktu penggunaan GitHub Actions, tetapi karena gratis untuk open source, pemakaian seperti ini tampaknya masuk akal
Saya pernah menulis sendiri homebrew-bump-revision, workflow otomatis untuk bump versi di Homebrew tap saya
Saya memakainya dengan baik di beberapa proyek pribadi
Saya tidak mencobanya karena malas, tetapi ini tool yang bagus
Ada episode di podcast Ruby Rogues yang membahas berbagai tips saat mendistribusikan CLI dengan Homebrew
Anda bisa mendengar lebih banyak lewat tautan episode terkait
Saya menemukan hal yang menarik soal packaging tool Python
Beberapa paket Python dapat menimbulkan loop dependensi selama proses build sehingga tidak kompatibel dengan Homebrew
pip tidak bermasalah karena mengunduh rilis biner, tetapi Homebrew membangun sendiri semua dependensi, sehingga prosesnya jauh lebih lama
Akibatnya, proyek Python berukuran sedang pun bisa memerlukan lebih dari satu jam untuk build "bottle"
Sejak mulai memakai nix untuk administrasi sistem, saya tidak pernah menyesalinya sedikit pun
Satu-satunya hal yang agak disayangkan hanyalah bahwa saya tetap harus bergantung pada Windows karena game multipemain