Les modules Go sont le mécanisme standard de gestion des dépendances, introduit dans Go 1.11+. Les fichiers principaux sont go.mod (définit les dépendances minimales et leurs versions) et go.sum (garantit l'intégrité via des hachages).
Pour ajouter une dépendance, on utilise :
go get github.com/pkg/errors@v0.9.1
Pour mettre à jour les dépendances :
go get -u ./... go mod tidy # supprimer les inutilisées
Go supporte le versionnement sémantique (semver), et les dépendances sont fixées de manière stricte : le projet est reproductible, la construction est déterministe. Mais il faut prendre en compte :
Que se passera-t-il si vous supprimez le fichier go.sum et exécutez la commande go build, et pourquoi est-ce dangereux ?
Beaucoup pensent que Go reconstruira simplement les dépendances à partir de zéro. Mais le fichier go.sum contient des hachages de tous les modules utilisés et protège contre la substitution (attaque de la chaîne d'approvisionnement). Si vous le supprimez,
à la prochaine construction, Go téléchargera à nouveau les dépendances, régénérera le fichier, mais si le dépôt de la dépendance a été modifié par un attaquant — la protection est brisée ! Il est possible qu'il y ait une substitution de code en production.
Histoire
Dans un projet majeur, le dépôt est passé de vendoring à go modules, les versions n'ont pas été fixées. Après un mois, les mises à jour des paquets tiers ont rompu la compatibilité, il est devenu impossible de compiler l'ancienne branche — le code a perdu sa reproductibilité.
Histoire
Dans un autre projet, le développeur a accidentellement supprimé go.sum. Après un nouveau lancement, l'équipe a remarqué que certaines dépendances avaient changé, des bogues liés à l'incompatibilité des versions mineures sont apparus — ce qui a entraîné un retour en arrière de plusieurs jours.
Histoire
L'utilisation de chemins de remplacement pour les répertoires locaux (replace ... = ../some/library) n'a pas été supprimée avant le déploiement — dans le pipeline CI/CD, la construction a échoué car le système externe n'avait pas accès aux fichiers locaux, et la production est restée "bloquée" sur une version incorrecte.