Warum "go get" kaputt ist und wie man es repariert?
\nWenn 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.
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\nKurze Geschichte: Von GOPATH zu Modulen
\nBis 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.
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
- Fügt eine Abhängigkeit zur
go.modhinzu \n - Lädt sie in den Cache herunter (normalerweise
$GOPATH/pkg/mod) \n - Erstellt keine Binärdatei in
$GOPATH/bin\n
Wenn Sie ein fertiges Programm installieren müssen (z. B. ein Kommandozeilen-Tool) — verwenden Sie go install.
Wie funktioniert go get jetzt: Schritt-für-Schritt-Analyse
\nÖffnen Sie ein Terminal und erstellen Sie ein neues Modul:
\nmkdir myproject\ncd myproject\ngo mod init myproject\nJetzt möchten wir zum Beispiel die beliebte Bibliothek gorilla/mux für das Routing hinzufügen. Früher hätten wir geschrieben:
go get github.com/gorilla/mux\nUnd das würde funktionieren — die Bibliothek wird heruntergeladen. Aber schauen Sie, was passiert ist:
\n- \n
- In der
go.moderschien eine Zeile:require github.com/gorilla/mux v1.8.0\n - Im Projektordner erschien
go.sum— eine Datei mit Prüfsummen für die Sicherheit \n - Die Quelltexte der Bibliothek liegen im Cache, nicht neben dem Projekt \n
Jetzt können Sie das Paket in Ihrem Code importieren:
\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}\nStarten 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.
Installation von Binärdateien: go install eilt zur Hilfe
\nAngenommen, 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:
go get github.com/golangci/golangci-lint/cmd/golangci-lint\nDas funktioniert jetzt nicht mehr (es gibt eine Warnung aus). Der richtige Weg:
\ngo install github.com/golangci/golangci-lint/cmd/golangci-lint@latest\nWas 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
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:
echo $GOPATH\n# normalerweise /home/user/go\nls ~/go/bin/\nWenn sich dort Ihre Binärdatei befindet — ist alles in Ordnung.
\n\nTypische Anfängerfehler (und wie man sie vermeidet)
\nAuf Stack Overflow wird am häufigsten nach diesen Fallstricken gefragt:
\n- \n
- "go get erstellt keinen src-Ordner"
Blogs
Buchempfehlungen
Lesen Sie auch
HTTP-Client in Swift: Anfragen richtig von A bis Z stellen
Event-Driven-Architektur in C#: Wie man Ereignisse wie ein Profi verwaltet
Wie man ein REST API in C# in 30 Minuten schreibt: Schritt-für-Schritt-Anleitung
Fehlerbehandlung in C#: try/catch, finally und bewährte Methoden
Die Top 5 Fehler von Go-Anfängern und wie man sie vermeidet