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 Verzeichnisbar/
. Innerhalb des Verzeichnissesbar/
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?
- Caveat 1: GoLang Version 1.11 oder höher
- Caveat 2: Änderungen an GOPATH und GOROOT rückgängig machen
- Caveat 3: Sie müssen das ~/go-Verzeichnis nicht ändern
- Go-Module verwenden
- Aber ich habe bereits ein Projekt, das GOPATH verwendet, wie kann ich es migrieren?
- Das ist cool, also sollte ich Module, Submodule und Sub-Submodule erstellen? Nein.
- Was soll ich mit den Dateien `go.mod` und `go.sum` machen?
- Abschluss
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:
- Es ist nur ein einziger Befehl erforderlich, um ein bestehendes Projekt auf die Verwendung von Go Modules umzustellen;
- Es wirkt sich nur auf Ihre Entwicklungsumgebung aus (wie GOPATH), so dass es Ihre Produktionsbereitstellung in keiner Weise beeinträchtigt;
- 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:
- 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. - 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:
- Verschieben Sie das Verzeichnis Ihres Projekts an einen Ort außerhalb
~/go/
- 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!