Zähmung von go get: Paketinstallation in Go für Anfänger

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Warum "go get" kaputt ist und wie man es repariert?

\n

Wenn Sie sich jemals gefragt haben "How can I install a package with go get?" — sind Sie nicht allein. Diese Frage hat auf Stack Overflow tausende Aufrufe erhalten, und das zu Recht. Früher war alles einfach: go get github.com/some/package — und die Bibliothek war in Ihrem $GOPATH/src. Aber nach der Veröffentlichung von Go 1.16 hat sich alles geändert. Jetzt installiert go get keine Pakete mehr im herkömmlichen Sinne. Stattdessen aktualisiert es nur die go.mod. Für die Installation von Binärdateien gibt es jetzt den Befehl go install.

\n

In diesem Artikel werden wir analysieren, was passiert ist, wie man jetzt Pakete und Abhängigkeiten richtig installiert und warum Anfänger so oft verwirrt sind. Los geht's!

\n\n

Kurze Geschichte: Von GOPATH zu Modulen

\n

Bis zur Version Go 1.11 lebte der gesamte Code in GOPATH — einem speziellen Ordner, in dem alle Ihre Projekte und Drittanbieter-Pakete lagen. Der Befehl go get lud die Quelltexte direkt dorthin. Das war praktisch, verursachte aber Versionsprobleme: Wenn zwei Projekte unterschiedliche Versionen derselben Bibliothek benötigten, begann das Chaos.

\n

Mit dem Aufkommen von Go modules (ab Go 1.11 und stabil ab 1.16) erhielt jedes Projekt seine eigene go.mod — eine Datei, in der Abhängigkeiten und deren Versionen festgelegt sind. Jetzt funktioniert go get anders:

\n
    \n
  • Fügt eine Abhängigkeit zur go.mod hinzu
  • \n
  • Lädt sie in den Cache herunter (normalerweise $GOPATH/pkg/mod)
  • \n
  • Erstellt keine Binärdatei in $GOPATH/bin
  • \n
\n

Wenn Sie ein fertiges Programm installieren müssen (z. B. ein Kommandozeilen-Tool) — verwenden Sie go install.

\n\n

Wie funktioniert go get jetzt: Schritt-für-Schritt-Analyse

\n

Öffnen Sie ein Terminal und erstellen Sie ein neues Modul:

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

Jetzt möchten wir zum Beispiel die beliebte Bibliothek gorilla/mux für das Routing hinzufügen. Früher hätten wir geschrieben:

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

Und das würde funktionieren — die Bibliothek wird heruntergeladen. Aber schauen Sie, was passiert ist:

\n
    \n
  1. In der go.mod erschien eine Zeile: require github.com/gorilla/mux v1.8.0
  2. \n
  3. Im Projektordner erschien go.sum — eine Datei mit Prüfsummen für die Sicherheit
  4. \n
  5. Die Quelltexte der Bibliothek liegen im Cache, nicht neben dem Projekt
  6. \n
\n

Jetzt können Sie das Paket in Ihrem Code importieren:

\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

Starten Sie go run main.go — alles funktioniert. Aber wenn Sie eine Binärdatei (ein kompiliertes Programm) erhalten wollten — go get wird Ihnen diese nicht geben.

\n\n

Installation von Binärdateien: go install eilt zur Hilfe

\n

Angenommen, Sie haben ein cooles Go-Tool gefunden, z. B. golangci-lint — einen Linter für Code. Um es als Befehl im System zu installieren, schrieb man früher:

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

Das funktioniert jetzt nicht mehr (es gibt eine Warnung aus). Der richtige Weg:

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

Was passiert:

\n
    \n
  • Go lädt die Quelltexte des Tools herunter
  • \n
  • Kompiliert sie
  • \n
  • Legt die fertige Binärdatei in $GOPATH/bin (oder $GOBIN, falls die Variable gesetzt ist) ab
  • \n
\n

Stellen Sie sicher, dass $GOPATH/bin zu PATH hinzugefügt wurde — sonst ist der Befehl nicht verfügbar. Überprüfen können Sie das so:

\n
echo $GOPATH\n# normalerweise /home/user/go\nls ~/go/bin/
\n

Wenn sich dort Ihre Binärdatei befindet — ist alles in Ordnung.

\n\n

Typische Anfängerfehler (und wie man sie vermeidet)

\n

Auf Stack Overflow wird am häufigsten nach diesen Fallstricken gefragt:

\n