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:

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