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 :
- Visibilité : Vous ne pouvez pas voir votre version en consultant un fichier. Vous devez exécuter une commande git pour la trouver.
- Revues de code : Une augmentation de version (version bump) n'apparaît pas dans un diff de code. C'est un push de tag, pas un changement de code.
- Builds locaux : Un commit sans tag affiche une pseudo-version confuse. Vous n'obtenez une version propre qu'après avoir tagué le commit.
- Versions majeures : C'est le changement le plus important. En Go, la v2 et les versions supérieures doivent inclure la version dans le chemin d'importation (import path).
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