package.json vs go.mod: Ke mana field version pergi?
Jika Anda berpindah dari JavaScript ke Go, satu hal akan mengejutkan Anda.
Buka file package.json. Anda akan melihat field version tepat di bagian atas. Mudah dibaca. Anda dapat mengubahnya dalam sebuah pull request. Ia berada di dalam kode Anda.
Sekarang buka file go.mod.
Versinya tidak ada di sana. Ini bukan kesalahan. Ini adalah sebuah pilihan.
Go tidak menggunakan field version untuk modul Anda sendiri. Sebagai gantinya, Go menggunakan git tags.
Cara kerjanya:
• Anda menjalankan git tag v1.2.3
• Anda melakukan push tag tersebut ke repositori Anda
• Tag tersebut menjadi versi Anda
Saat seseorang menjalankan go get, Go akan melihat git tags Anda untuk menemukan commit yang tepat. Tag tersebut adalah satu-satunya sumber kebenaran (single source of truth).
Desain ini memiliki kekuatan utama. Sebuah versi tidak akan pernah merujuk ke kode yang salah. Di npm, kode yang dipublikasikan dan field version bisa tidak sinkron. Di Go, keduanya adalah hal yang sama. Versinya adalah commit tersebut.
Namun, hal ini mengubah alur kerja Anda:
- Visibilitas: Anda tidak dapat melihat versi Anda hanya dengan melihat sebuah file. Anda harus menjalankan perintah git untuk menemukannya.
- Code Review: Peningkatan versi (version bump) tidak muncul dalam diff kode. Itu adalah push tag, bukan perubahan kode.
- Build Lokal: Sebuah commit tanpa tag akan menampilkan pseudo-version yang berantakan. Anda baru akan mendapatkan versi yang bersih setelah Anda memberikan tag pada commit tersebut.
- Versi Mayor: Ini adalah perubahan terbesar. Di Go, v2 ke atas harus menyertakan versi dalam import path.
Contoh: v1 menggunakan github.com/you/my-app v2 menggunakan github.com/you/my-app/v2
Hal ini memungkinkan satu program menggunakan dua versi mayor yang berbeda dari library yang sama tanpa konflik.
Kebanyakan bahasa lain menyimpan versi di dalam sebuah file: • Node: package.json • Rust: Cargo.toml • Python: pyproject.toml • Java: pom.xml
Go adalah pengecualian. Ia sangat bergantung pada git tags.
Jika Anda merindukan pengalaman npm, Anda dapat menyuntikkan (inject) versi ke dalam binary Anda saat waktu build menggunakan ldflags. Ini memungkinkan aplikasi Anda merespons perintah versi.
Komprominya sederhana: Field version mudah dibaca dan ditinjau, tetapi bisa saja tidak akurat. Git tag sulit dilihat, tetapi selalu benar.
Go memilih kebenaran di atas kenyamanan.
Untuk para pengembang Go: Apakah ini model terbaik? Apakah Anda lebih suka adanya field version di go.mod jika alat-alat memverifikasinya terhadap git tag?
Sumber: https://dev.to/dalirnet/packagejson-vs-gomod-where-did-the-version-field-go-3301