Apprivoiser go get : installation de paquets en Go pour les débutants

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Pourquoi "go get" est cassé et comment le réparer ?

\n

Si 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.

\n

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\n

Bref historique : de GOPATH aux modules

\n

Avant 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.

\n

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
    \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
\n

Si vous avez besoin d'installer un programme prêt à l'emploi (par exemple, un utilitaire en ligne de commande) — utilisez go install.

\n\n

Comment fonctionne go get maintenant : analyse étape par étape

\n

Ouvrez un terminal et créez un nouveau module :

\n
mkdir myproject\ncd myproject\ngo mod init myproject
\n

Maintenant, nous voulons ajouter, disons, la bibliothèque populaire gorilla/mux pour le routage. Avant, nous aurions écrit :

\n
go get github.com/gorilla/mux
\n

Et cela fonctionnera — la bibliothèque sera téléchargée. Mais regardez ce qui s'est passé :

\n
    \n
  1. Dans go.mod, une ligne est apparue : require github.com/gorilla/mux v1.8.0
  2. \n
  3. Dans le dossier du projet, un fichier go.sum est apparu — un fichier avec des sommes de contrôle pour la sécurité
  4. \n
  5. Les sources de la bibliothèque se trouvent dans le cache, pas à côté du projet
  6. \n
\n

Maintenant, dans votre code, vous pouvez importer le paquet :

\n
package main\n\nimport (\n    "fmt"\n    "github.com/gorilla/mux"\n)\n\nfunc main() {\n    r := mux.NewRouter()\n    fmt.Println("Router created!")\n}
\n

Exécutez go run main.go — tout fonctionne. Mais si vous vouliez obtenir un binaire (un programme compilé) — go get ne vous le donnera pas.

\n\n

Installation de binaires : go install vient à la rescousse

\n

Supposons 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 :

\n
go get github.com/golangci/golangci-lint/cmd/golangci-lint
\n

Maintenant, cela ne fonctionnera pas (cela affichera un avertissement). La méthode correcte :

\n
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
\n

Ce 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
\n

Assurez-vous que $GOPATH/bin est ajouté à PATH — sinon la commande ne sera pas accessible. Vous pouvez vérifier ainsi :

\n
echo $GOPATH\n# généralement /home/user/go\nls ~/go/bin/
\n

Si votre binaire s'y trouve — tout va bien.

\n\n

Erreurs typiques des débutants (et comment les éviter)

\n

Sur Stack Overflow, on demande le plus souvent à propos de ces pièges :

\n