𝗣𝗮𝗰𝗸𝗮𝗴𝗲.𝗷𝘀𝗼𝗻 проти 𝗚𝗼.𝗺𝗼𝗱: куди зникло поле версії?

Якщо ви переходите з JavaScript на Go, одна річ вас здивує.

У файлі package.json версія знаходиться прямо зверху. Ви можете її прочитати. Ви можете змінити її в pull request. Ви можете її знайти. Це факт, який живе безпосередньо у вашому коді.

Тепер відкрийте файл go.mod. Версії там немає.

Це не помилка. Це свідомий вибір.

Go не використовує поле версії для вашого власного модуля. Замість цього Go використовує git tags.

Щоб встановити версію в Go, потрібно зробити наступне:

Git tag є єдиним джерелом істини. Коли хтось запускає go get, Go шукає теги у вашому репозиторії, щоб знайти потрібний коміт.

Ця архітектура має велику перевагу. Версія ніколи не може вказувати на неправильний код. В npm опублікований код і тегований вихідний код можуть розходитися. В Go це одне й те саме, оскільки версія є вказівником на коміт.

Однак це змінює ваш робочий процес у кількох аспектах:

Більшість інших екосистем зберігають версію у файлі:

Go працює інакше. Він покладається лише на git tags.

Якщо ви хочете, щоб ваш Go-бінарний файл показував чисту версію, ви можете впровадити її під час процесу збірки за допомогою ldflags. Багато розробників також використовують такі інструменти, як goreleaser, щоб автоматизувати процес тегування та релізів.

Ці дві моделі представляють різні пріоритети:

Go обрав модель тегів, щоб гарантувати, що маніфест завжди відповідає коду.

Для тих, хто випускає Go-код: як модель, що базується лише на тегах, відчувається у вашій щоденній роботі? Чи змінили б ви її?

Джерело: https://dev.to/dalirnet/packagejson-vs-gomod-where-did-the-version-field-go-3301