Dalam dunia antarmuka command-line, konsistensi dan prediktabilitas sangatlah penting. Sebuah paket Go baru bernama argp baru-baru ini muncul, menjanjikan untuk menyediakan parser argumen command line berstandar GNU. Namun, peluncurannya telah memicu diskusi signifikan di antara para pengembang tentang standar CLI, masalah kompatibilitas, dan ketegangan berkelanjutan antara mengikuti konvensi yang sudah mapan versus memperkenalkan pendekatan baru.
Pertarungan Standar CLI
Pengenalan parser baru ini telah menghidupkan kembali perdebatan lama tentang standar antarmuka command-line mana yang harus diikuti oleh pengembang. Meskipun paket tersebut mengklaim mengimplementasikan parsing argumen gaya GNU, beberapa komentator telah menunjukkan inkonsistensi dengan standar GNU yang sebenarnya. Salah satu penyimpangan yang mencolok adalah penanganan beberapa nilai untuk opsi. Dokumentasi paket menyarankan bahwa -a 1 2 3
akan menetapkan ketiga nilai tersebut ke opsi a, sedangkan gaya GNU tradisional akan menafsirkan ini sebagai opsi a dengan nilai 1, diikuti oleh dua argumen posisional.
Secara umum, parser argumen command-line harus mengikuti gaya GNU. Tidak lebih, tidak kurang. Penyimpangan membingungkan pengguna karena tidak langsung jelas bagi mereka aturan apa yang diterapkan oleh parser.
Sentimen ini mencerminkan frustrasi umum di antara pengembang yang harus menavigasi perilaku CLI yang tidak konsisten di berbagai alat. Standar POSIX, yang mendahului konvensi GNU, bahkan lebih ketat dan sama sekali tidak mendefinisikan opsi panjang. Hal ini telah menyebabkan lanskap yang terfragmentasi di mana komunitas yang berbeda (Go, Python, Java) telah mengembangkan konvensi CLI mereka sendiri, seringkali mengecewakan pengguna yang mengharapkan perilaku yang konsisten.
Parser Command Line Populer di Go
- Standard library flag: Flag sederhana dengan gaya Go (
-flag=value
) - Cobra/pflag: Flag dengan gaya GNU dengan dukungan penyelesaian otomatis
- Kong: Fungsionalitas lanjutan seperti pengelompokan flag dan asosiasi variabel lingkungan
- urfave/cli: Alternatif populer dengan pengalaman pengembang yang baik
- go-flags: Pendekatan berbasis struct menggunakan tag
- argp: Parser gaya GNU baru dengan dukungan tag struct
Aturan Command Line GNU
- Argumen dianggap sebagai opsi ketika diawali dengan tanda hubung
-
- Beberapa opsi pendek dapat digabungkan:
-abc
sama dengan-a -b -c
- Opsi panjang dimulai dengan dua tanda hubung:
--verbose
- Nilai opsi dapat dipisahkan dengan spasi, tanda sama dengan, atau tanpa pemisah
- Opsi dan non-opsi dapat diselingi
--
mengakhiri semua opsi- Sebuah
-
tunggal diperlakukan sebagai non-opsi
Masalah Kompatibilitas dan Kasus Khusus
Masalah yang cukup diperdebatkan dalam diskusi ini melibatkan penanganan tanda sama dengan dalam opsi pendek. Dokumentasi paket menyatakan bahwa -a=1
setara dengan -a 1
, tetapi ini dapat menciptakan masalah dengan alat seperti cut
di mana -d=
adalah pola penggunaan umum. Jika tanda sama dengan dihilangkan oleh parser, itu mengubah perilaku dengan cara yang berpotensi merusak.
Hal ini menyoroti tantangan yang lebih luas: kompatibilitas mundur. Skrip shell dan alur kerja pengguna yang telah mengandalkan perilaku CLI tertentu selama beberapa dekade dapat rusak ketika alat baru menerapkan aturan parsing yang berbeda. Beberapa komentator membagikan contoh dunia nyata di mana inkonsistensi ini telah menyebabkan masalah, seperti dalam manajemen paket Gentoo di mana nama paket yang tepat harus dimulai dengan tanda sama dengan.
Ekosistem Parser Command Line
Diskusi tersebut mengungkapkan bahwa komunitas Go sudah memiliki beberapa parser command line mapan dengan pendekatan dan fitur yang berbeda. Cobra (dengan pflag), Kong, dan urfave/cli sering disebutkan sebagai alternatif yang matang. Masing-masing memiliki kekuatan – Cobra menawarkan penyelesaian shell otomatis, Kong menangani antarmuka CLI yang kompleks dengan baik, dan go-flags menyediakan pendekatan berbasis struct yang mirip dengan paket baru.
Fragmentasi ini menimbulkan pertanyaan tentang apakah parser lain diperlukan, terutama yang memperkenalkan interpretasinya sendiri tentang standar GNU. Beberapa pengembang mengungkapkan frustrasi bahwa paket flag perpustakaan standar Go tidak mengikuti konvensi GNU, sementara yang lain membela pendekatan Go yang lebih sederhana karena lebih konsisten dalam ekosistemnya sendiri.
Pertimbangan Refleksi dan Kinerja
Masalah teknis yang diangkat oleh beberapa pengembang adalah penggunaan struct tag dan refleksi dalam parser baru. Meskipun pendekatan ini memungkinkan gaya deklaratif yang bersih untuk mendefinisikan opsi command-line, itu datang dengan potensi kelemahan. Refleksi dapat memengaruhi kinerja dan menonaktifkan eliminasi kode mati selama kompilasi, yang berpotensi menyebabkan ukuran biner yang lebih besar. Ini juga memindahkan validasi dari waktu kompilasi ke waktu runtime, yang dianggap bermasalah oleh beberapa pengembang.
Perdebatan seputar struct tag menyoroti ketegangan yang lebih luas dalam pengembangan Go antara mengikuti pola idiomatik dan mengoptimalkan untuk kinerja dan keamanan. Meskipun banyak paket Go populer menggunakan refleksi dan struct tag (seperti encoding/json), beberapa pengembang lebih menyukai kode eksplisit daripada perilaku runtime yang ajaib.
Pada akhirnya, diskusi seputar parser command line baru ini mencerminkan tantangan berkelanjutan dalam menyeimbangkan kepatuhan standar, harapan pengguna, dan idiom bahasa. Meskipun memiliki pilihan itu berharga, proliferasi pendekatan yang sedikit berbeda untuk parsing CLI terus menciptakan gesekan bagi pengembang dan pengguna. Seperti yang dicatat oleh seorang komentator, mungkin hal yang paling penting bukanlah standar mana yang terbaik, tetapi bahwa alat secara konsisten mengikuti beberapa standar yang dapat diandalkan pengguna.
Referensi: GNU command line argument parser