GoLang: Warum nicht den GOPATH benutzen

In den früheren Versionen von Go war es erforderlich, einige Umgebungsvariablen einzurichten, um es zu konfigurieren. Mit der Zeit wurden diese Anforderungen entfernt, aber viele Online-Tutorials erwähnen immer noch diese Variablen, was zu Verwirrung führt.

Kürzlich wurde eine neue Funktion namens Go Modules veröffentlicht, die den GOPATH endlich überflüssig macht. In diesem Beitrag werde ich erklären, was der GOPATH ist, warum Go-Module bevorzugt werden und wie man ein Projekt so konfiguriert, dass es Go-Module verwendet (was überraschend einfach ist).

Der GOPATH ist eine Umgebungsvariable, die Go mitteilt, wo es alle Quelldateien lesen und herunterladen soll, die es zum Kompilieren des Projekts verwendet. Dieses Konzept ist mit einigen ungewöhnlichen Einschränkungen verbunden, die man bei anderen Programmiersprachen nicht findet:

  • Es verlangt von Ihnen, dass Sie Ihre Go-Projekte innerhalb des Verzeichnisses schreiben, auf das die GOPATH-Variable zeigt (standardmäßig ~/go), auch wenn Ihre anderen Projekte woanders liegen;
  • Die Verzeichnishierarchie innerhalb des GOPATH-Verzeichnisses muss die URL Ihres Projekts widerspiegeln. Wenn Ihre URL zum Beispiel github.com/foo/bar lautet, müssen Sie ein Verzeichnis $GOPATH/src/github.com erstellen, dann ein neues Verzeichnis darin anlegen: foo/ und innerhalb dieses Verzeichnisses ein neues Verzeichnis bar/ . Innerhalb des Verzeichnisses bar/ sollten Sie dann Ihr eigentliches Git-Projekt ablegen;
  • Es gibt keine eingebaute Möglichkeit, die Versionen der von Ihnen verwendeten Pakete zu verfolgen.

Das größte Problem bei diesem Aufbau ist, dass er sich völlig von dem unterscheidet, was wir von den meisten anderen Programmiersprachen gewohnt sind. Da es sich bei GOPATH um eine Umgebungsvariable handelt, müssen die Benutzer außerdem ein wenig über die Konfiguration ihres Betriebssystems wissen, was besonders für Anfänger fehleranfällig ist.

Warum sollten Sie Go Modules verwenden?

Go Modules ist nicht von den oben genannten Abhängigkeiten abhängig, um bestimmte Umgebungsvariablen einzurichten, und auch nicht von den Anforderungen, Ihr Projekt in ein bestimmtes Verzeichnis zu legen, wie es bei GOPATH der Fall ist.

Es ist außerdem rückwärtskompatibel, sicher und einfach zu benutzen:

  1. Es ist nur ein einziger Befehl erforderlich, um ein bestehendes Projekt auf die Verwendung von Go Modules umzustellen;
  2. Es wirkt sich nur auf Ihre Entwicklungsumgebung aus (wie GOPATH), so dass es Ihre Produktionsbereitstellung in keiner Weise beeinträchtigt;
  3. Es ist rückwärtskompatibel mit GOPATH, was bedeutet, dass, wenn Sie ein Projekt aktualisieren, um Go Modules zu verwenden, und Ihre Mitarbeiter es immer noch vorziehen, GOPATH zu verwenden, sie dies ohne Probleme tun können.

Ein weiterer Grund, die Verwendung von Go Modules zu lernen, ist, dass GOPATH in Zukunft wahrscheinlich nicht mehr weit verbreitet sein wird, so dass Sie es früher oder später lernen müssen.

Es gibt jedoch einige Einschränkungen:

Caveat 1: GoLang Version 1.11 oder höher

Go Modules funktioniert nur mit GoLang Version 1.11 oder höher. Zum Zeitpunkt des Verfassens dieses Beitrags verwendeten einige Linux-Distributionen, einschließlich Ubuntu, noch GoLang 1.10.

Sie können die aktuelle Version Ihres installierten Go-Pakets mit dem folgenden Befehl testen:

go version

Es sollte etwas wie folgt ausgegeben werden:

go version go1.11.2 linux/amd64

Wenn die angezeigte Version unter 1.11.x liegt, müssen Sie sie deinstallieren und die folgenden Schritte ausführen, um die erforderliche Go-Version zu installieren. Beachten Sie auch, dass die folgenden Anweisungen für Ubuntu und abgeleitete Distributionen gedacht sind. Wenn Sie eine andere Distribution verwenden, müssen Sie die Befehle anpassen, damit sie für Sie funktionieren.

Öffne zunächst ein Terminal und führe die folgenden Befehle aus:

# If you have already installed the Go package remove it:
sudo apt-get remove --purge --auto-remove golang# Make sure your system is up-to-date:
sudo apt-get update
sudo apt-get -y upgrade# Download the Go 1.11 package and extract it:
wget https://dl.google.com/go/go1.11.linux-amd64.tar.gz
sudo tar -xvf go1.11.linux-amd64.tar.gz# Install it manually on your /usr/local directory:
sudo mv go /usr/local
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc# Then close your terminal, open a new one and test if Go is at the correct version:
which go # should output: /usr/local/go/bin/go
go version # should output: go version go1.11.x linux/amd64 or similar
  • Lade das Go 1.11-Paket (oder neuer) herunter und entpacke es:
    wget https://dl.google.com/go/go1.11.linux-amd64.tar.gz
    sudo tar -xvf go1.11.linux-amd64.tar.gz
  • Installiere es manuell in deinem /usr/local-Verzeichnis:
    sudo mv go /usr/local
    echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
  • Schließen Sie dann Ihr Terminal, öffnen Sie ein neues und testen Sie, ob Go die richtige Version hat:
    which go, sollte ausgegeben werden: /usr/local/go/bin/go
    go version, sollte ausgeben: go version go1.11.x linux/amd64 oder ähnlich
  • Wenn Sie das Go-Paket bereits installiert haben, entfernen Sie es:
    sudo apt-get remove --purge --auto-remove golang
  • Stellen Sie sicher, dass Ihr System auf dem neuesten Stand ist:
    sudo apt-get update
    sudo apt-get -y upgrade
  • Laden Sie das Go 1.11-Paket herunter und entpacken Sie es:
    wget https://dl.google.com/go/go1.11.linux-amd64.tar.gz
    sudo tar -xvf go1.11.linux-amd64.tar.gz
  • Installieren Sie es manuell in Ihrem /usr/local-Verzeichnis:
    sudo mv go /usr/local
    echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
  • Schließen Sie dann Ihr Terminal, öffnen Sie ein neues und testen Sie, ob Go die richtige Version hat:
    which go, sollte ausgegeben werden: /usr/local/go/bin/go
    go version, sollte ausgeben: go version go1.11.x linux/amd64 oder ähnlich

Caveat 2: Änderungen an GOPATH und GOROOT rückgängig machen

Wenn Sie Änderungen an den Standardwerten Ihres GOPATH oder GOROOT vorgenommen haben, könnte es ratsam sein, diese Änderungen zu entfernen. Sie sind nicht notwendig und die Vermischung von GOPATH-Konfigurationen mit Go-Modulen kann zu Verwirrung führen. Genauer gesagt:

  1. Der Standardwert für den GOPATH (wenn er nicht gesetzt ist) ist ~/go , wenn ich also das Verzeichnis ~/go erwähne, meine ich das von Go verwendete Standardverzeichnis. Wenn Sie Änderungen an Ihrem GOPATH vorgenommen haben, könnte dieses Verzeichnis woanders liegen, daher schlage ich vor, dass Sie diese Änderungen rückgängig machen, um Verwirrung zu vermeiden.
  2. Sie sollten die Umgebungsvariable GOROOT nicht ändern müssen, da wir Go im Standardverzeichnis installiert haben: /usr/local. Wenn Sie jedoch diese Umgebungsvariable geändert haben, schlage ich vor, dass Sie dies rückgängig machen, um Verwirrung zu vermeiden.

Caveat 3: Sie müssen das ~/go-Verzeichnis nicht ändern

Wie bereits erwähnt, ist ~/go das Standardverzeichnis, in dem Go erwartet, Ihre Dateien zu lesen, wenn GOPATH nicht gesetzt ist. Dies macht jedoch nur einen Unterschied, wenn Sie vorhaben, Ihre Projekte mit GOPATH zu erstellen.

Wenn Sie Go-Module verwenden wollen, brauchen Sie das Verzeichnis ~/go nicht zu erstellen, zu bearbeiten oder gar zu lesen. Wenn es noch nicht existiert, wird es automatisch für Sie erstellt, und wenn es existiert, sollten Sie dort nichts ändern müssen.

Sie können also alle Schritte des Tutorials ignorieren, die Sie auffordern, Änderungen in diesem Verzeichnis vorzunehmen, da sie sich wahrscheinlich auf die GOPATH-Anforderungen beziehen.

Auch wenn Sie ein Go-Projekt in diesem Verzeichnis haben und wollen, dass es mit Go-Modulen funktioniert, sollten Sie es nach draußen verschieben, da ältere Go-Versionen Go-Mod innerhalb des GOPATHs deaktivieren, selbst wenn es eine go.mod-Datei hat.

Go-Module verwenden

Die Verwendung von Go-Modulen besteht im Wesentlichen aus dem folgenden Befehl:

go mod init <your_projects_import_path>

Um ein neues Projekt zu erstellen, müssen Sie nur ein neues Verzeichnis erstellen (irgendwo außerhalb von ~/go/) und es dann als Modul initialisieren, d.h.:

mkdir myProject/
cd myProject
go mod init github.com/myGithubName/myProject

Der go mod init-Befehl wird eine neue Datei namens go.mod im Verzeichnis Ihres Projekts erstellen. Diese Datei enthält den Importpfad Ihres Projekts (in der Regel die URL Ihres Projektarchivs) und eine Liste aller Pakete, die Sie derzeit in diesem Projekt verwenden.

Sie sollten diese Datei nicht bearbeiten müssen, da sie von den meisten go-Befehlen wie go run und go get automatisch verwaltet wird. Nachdem Sie diese 3 Befehle ausgeführt haben, ist die Konfiguration dieses Verzeichnisses als Go-Modul abgeschlossen.

Um es zu testen, erstellen Sie eine neue Datei main.go in diesem Verzeichnis mit diesen Codezeilen:

package mainimport "fmt"func main() {
fmt.Println("Hello Go Modules")
}

Testen Sie es dann mit dem Befehl go run:

go run main.go 

Dies sollte wie erwartet Hello Go Modules ausgeben.

Aber ich habe bereits ein Projekt, das GOPATH verwendet, wie kann ich es migrieren?

Der Prozess ist ähnlich:

  1. Verschieben Sie das Verzeichnis Ihres Projekts an einen Ort außerhalb ~/go/
  2. Initialisieren Sie es als Go-Modul, z.B.
mv ~/go/src/github.com/myGithubName/myProject ~/anywhere_else/
cd ~/anywhere_else/myProject
go mod init github.com/myGithubName/myProject

Dann kannst du entweder mit go test ./... oder go run main.go testen, ob alles funktioniert. Beide Befehle laden automatisch ihre Abhängigkeiten herunter und aktualisieren die go.mod Datei.

Das ist cool, also sollte ich Module, Submodule und Sub-Submodule erstellen? Nein.

Es ist zwar möglich, mehrere Module in einem einzigen Projekt zu erstellen, aber das ist fast immer unnötig. Wenn Sie einen Unterordner benötigen, um Ihren Go-Code zu organisieren, sind Sie auf der Suche nach Paketen, nicht nach Modulen. Sie sollten den go mod init-Befehl nur einmal pro Projekt ausführen, nicht öfter.

Was soll ich mit den Dateien `go.mod` und `go.sum` machen?

Wie bei NPM’s package.json und package-lock.json erzeugt das Go Modules-Konzept auch einige Dateien, um den Überblick über alle Versionen Ihrer Abhängigkeiten zu behalten, nämlich die go.mod– und go.sum-Dateien.

Sie sollten keine dieser beiden Dateien bearbeiten müssen, da sie von einigen Go-Tools wie go get und go test automatisch verwaltet werden. Es ist auch eine gute Idee, sie zu deinen Commits hinzuzufügen, da sie benötigt werden, um reproduzierbare Builds deines Projekts durchzuführen, d.h. mit denselben Versionen und Paketen zu kompilieren, die du lokal hast.

Abschluss

Du solltest jetzt bereit sein, Go-Module in deinen eigenen Projekten zu verwenden. Die Verwendung ist nicht zwingend notwendig, aber wenn Sie bis hierher gelesen haben, haben Sie wahrscheinlich bemerkt, wie viel einfacher und intuitiver Go Modules im Vergleich zu GOPATH ist. Außerdem gibt es ein Feature, das Ihnen nur Go Modules bieten kann: Reproduzierbare Builds.

Wenn Sie mehr Details über Go Modules erfahren wollen, empfehle ich Ihnen diesen Beitrag für eine kürzere Version oder diesen für eine längere, beide sind sehr prägnant und leicht zu lesen. Ich empfehle Ihnen auch, Ihre eigenen Nachforschungen anzustellen, es gibt mehrere großartige Beiträge zu diesem Thema im Web. Viel Spaß beim Kodieren!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.