𝗣𝗮𝗰𝗸𝗮𝗴𝗲.𝗷𝘀𝗼𝗻 𝗹𝘄𝗻 𝗚𝗼.𝗺𝗼𝗱: 𝗞𝗲 𝗺𝗮𝗻𝗮 𝗽𝗲𝗿𝗴𝗶𝗸𝗮𝗻𝘆𝗮 𝗺𝗲𝗱𝗮𝗻 𝘃𝗲𝗿𝘀𝗶?

Jika anda beralih daripada JavaScript ke Go, satu perkara akan mengejutkan anda.

Dalam fail package.json, versi berada tepat di bahagian atas. Anda boleh membacanya. Anda boleh mengubahnya dalam pull request. Anda boleh mencarinya. Ia adalah satu fakta yang wujud di dalam kod anda.

Sekarang buka fail go.mod. Versi tidak ada di sana.

Ini bukan satu kesilapan. Ia adalah satu pilihan.

Go tidak menggunakan medan versi untuk modul anda sendiri. Sebaliknya, Go menggunakan git tags.

Untuk menetapkan versi dalam Go, anda lakukan ini:

Git tag adalah satu-satunya sumber kebenaran (single source of truth). Apabila seseorang menjalankan go get, Go akan melihat tag repositori anda untuk mencari commit yang betul.

Reka bentuk ini mempunyai kekuatan utama. Versi tidak akan pernah merujuk kepada kod yang salah. Dalam npm, kod yang diterbitkan dan sumber yang ditag boleh terpisah. Dalam Go, kedua-duanya adalah perkara yang sama kerana versi adalah penunjuk (pointer) kepada commit.

Walau bagaimanapun, ini mengubah aliran kerja anda dalam beberapa cara:

Kebanyakan ekosistem lain menyimpan versi dalam fail:

Go adalah berbeza. Ia hanya bergantung pada git tags.

Jika anda mahu binari Go anda memaparkan versi yang bersih, anda boleh menyuntiknya semasa proses binaan menggunakan ldflags. Ramai pembangun juga menggunakan alatan seperti goreleaser untuk mengautomasikan proses tag dan pelepasan (release).

Kedua-dua model ini mewakili keutamaan yang berbeza:

Go memilih model tag untuk memastikan manifes sentiasa sepadan dengan kod.

Bagi mereka yang mengeluarkan kod Go: Bagaimanakah model berasaskan tag sahaja dirasakan dalam kerja harian anda? Adakah anda akan mengubahnya?

Sumber: https://dev.to/dalirnet/packagejson-vs-gomod-where-did-the-version-field-go-3301