package.json vs go.mod : Où est passé le champ de version ?

Si vous passez de JavaScript à Go, une chose va vous surprendre.

Ouvrez un fichier package.json. Vous verrez un champ version tout en haut. Il est facile à lire. Vous pouvez le modifier dans une pull request. Il réside à l'intérieur de votre code.

Maintenant, ouvrez un fichier go.mod.

La version n'y est pas. Ce n'est pas une erreur. C'est un choix.

Go n'utilise pas de champ de version pour votre propre module. Il utilise des tags git à la place.

Comment ça marche : • Vous lancez git tag v1.2.3 • Vous poussez le tag vers votre dépôt • Ce tag devient votre version

Lorsque quelqu'un lance go get, Go consulte vos tags git pour trouver le bon commit. Le tag est l'unique source de vérité.

Cette conception présente une force majeure. Une version ne peut jamais pointer vers le mauvais code. Dans npm, le code publié et le champ de version peuvent diverger. Dans Go, ils sont une seule et même chose. La version est le commit.

Cependant, cela modifie votre flux de travail :

Exemple : v1 utilise github.com/you/my-app v2 utilise github.com/you/my-app/v2

Cela permet à un programme d'utiliser deux versions majeures différentes de la même bibliothèque sans conflit.

La plupart des autres langages conservent la version dans un fichier : • Node : package.json • Rust : Cargo.toml • Python : pyproject.toml • Java : pom.xml

Go est l'exception. Il repose strictement sur les tags git.

Si l'expérience npm vous manque, vous pouvez injecter la version dans votre binaire au moment du build en utilisant les ldflags. Cela permet à votre application de répondre à une commande de version.

Le compromis est simple : Un champ de version est facile à lire et à réviser, mais il peut mentir. Un tag git est difficile à voir, mais il est toujours vrai.

Go a choisi la vérité plutôt que la commodité.

Aux développeurs Go : Est-ce le meilleur modèle ? Préféreriez-vous un champ de version dans go.mod si les outils le vérifiaient par rapport au tag git ?

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