Pourquoi "go get" est cassé et comment le réparer ?
\nSi vous vous êtes déjà demandé "How can I install a package with go get?" — vous n'êtes pas seul. Cette question a recueilli des milliers de vues sur Stack Overflow, et pour cause. Avant, tout était simple : go get github.com/some/package — et la bibliothèque se trouvait dans $GOPATH/src. Mais après la sortie de Go 1.16, tout a changé. Désormais, go get n'installe plus les paquets au sens traditionnel. Au lieu de cela, il ne fait que mettre à jour go.mod. Et pour installer des binaires, la commande go install a été introduite.
Dans cet article, nous allons comprendre ce qui s'est passé, comment installer correctement les paquets et les dépendances maintenant, et pourquoi les débutants sont si souvent confus. C'est parti !
\n\nBref historique : de GOPATH aux modules
\nAvant la version Go 1.11, tout le code vivait dans GOPATH — un dossier spécial où se trouvaient tous vos projets et paquets tiers. La commande go get téléchargeait les sources directement dedans. C'était pratique, mais cela créait des problèmes de versions : si deux projets nécessitaient des versions différentes d'une même bibliothèque — l'enfer commençait.
Avec l'arrivée des Go modules (à partir de Go 1.11 et stablement depuis la 1.16), chaque projet a reçu son propre go.mod — un fichier où sont listées les dépendances et leurs versions. Maintenant, go get fonctionne différemment :
- \n
- Ajoute la dépendance dans
go.mod\n - Télécharge celle-ci dans le cache (généralement
$GOPATH/pkg/mod) \n - Ne crée pas de binaire dans
$GOPATH/bin\n
Si vous avez besoin d'installer un programme prêt à l'emploi (par exemple, un utilitaire en ligne de commande) — utilisez go install.
Comment fonctionne go get maintenant : analyse étape par étape
\nOuvrez un terminal et créez un nouveau module :
\nmkdir myproject\ncd myproject\ngo mod init myproject\nMaintenant, nous voulons ajouter, disons, la bibliothèque populaire gorilla/mux pour le routage. Avant, nous aurions écrit :
go get github.com/gorilla/mux\nEt cela fonctionnera — la bibliothèque sera téléchargée. Mais regardez ce qui s'est passé :
\n- \n
- Dans
go.mod, une ligne est apparue :require github.com/gorilla/mux v1.8.0\n - Dans le dossier du projet, un fichier
go.sumest apparu — un fichier avec des sommes de contrôle pour la sécurité \n - Les sources de la bibliothèque se trouvent dans le cache, pas à côté du projet \n
Maintenant, dans votre code, vous pouvez importer le paquet :
\npackage main\n\nimport (\n "fmt"\n "github.com/gorilla/mux"\n)\n\nfunc main() {\n r := mux.NewRouter()\n fmt.Println("Router created!")\n}\nExécutez go run main.go — tout fonctionne. Mais si vous vouliez obtenir un binaire (un programme compilé) — go get ne vous le donnera pas.
Installation de binaires : go install vient à la rescousse
\nSupposons que vous ayez trouvé un super utilitaire en Go, par exemple golangci-lint — un linter de code. Pour l'installer comme commande système, on écrivait avant :
go get github.com/golangci/golangci-lint/cmd/golangci-lint\nMaintenant, cela ne fonctionnera pas (cela affichera un avertissement). La méthode correcte :
\ngo install github.com/golangci/golangci-lint/cmd/golangci-lint@latest\nCe qui va se passer :
\n- \n
- Go téléchargera les sources de l'utilitaire \n
- Les compilera \n
- Mettra le binaire prêt dans
$GOPATH/bin(ou$GOBIN, si la variable est définie) \n
Assurez-vous que $GOPATH/bin est ajouté à PATH — sinon la commande ne sera pas accessible. Vous pouvez vérifier ainsi :
echo $GOPATH\n# généralement /home/user/go\nls ~/go/bin/\nSi votre binaire s'y trouve — tout va bien.
\n\nErreurs typiques des débutants (et comment les éviter)
\nSur Stack Overflow, on demande le plus souvent à propos de ces pièges :
\n- \n
- "go get ne crée pas le dossier src"
Blogs
Book Recommendations
Lire aussi
Surveillance et journalisation des applications Java : guide complet 2024
Fonctions Serverless en Go sur AWS Lambda : techniques avancées et optimisation
Monorepo avec Swift : organisation du code pour les projets iOS et macOS
Sécurité des applications C# : top 10 des vulnérabilités pour débutants
Startups sur Kotlin : comment le langage de JetBrains transforme les affaires