Lektionen des Moduls (4/5)
Go-Module
Ein Go-Modul ist eine versionierbare Einheit, die aus einem oder mehreren Paketen besteht. Es ist die Grundlage des modernen Abhängigkeitssystems (Go 1.11+): kein GOPATH mehr, kein obligatorischer vendor mehr, explizite und reproduzierbare Abhängigkeiten.
go.mod: das Modulmanifest
module example.com/myapp
go 1.22
require (
github.com/google/uuid v1.6.0
golang.org/x/time v0.5.0
)
Drei Hauptrichtlinien:
module <path>– der Importpfad des Moduls. Alle internen Pakete werden alsexample.com/myapp/sub/pkgimportiert. Es muss keine echte URL sein, aber zur Veröffentlichung übergo getmuss sie aufgelöst werden.go <version>– die mindestens erforderliche Go-Version (wird auch verwendet, um zu steuern, welche Sprachfunktionen zulässig sind, z. B. Range-Over-Func in 1.23).require– die direkten Abhängigkeiten mit ihrer genauen Version.
Andere Anweisungen: replace (ersetzt eine Dep durch einen Fork oder einen lokalen Pfad), exclude, retract.
go.sum: die kryptografische Sperrdatei
Neben go.mod enthält go.sum einen kryptografischen Hash JEDER heruntergeladenen Version (einschließlich transitiver Abhängigkeiten). Es garantiert Reproduzierbarkeit: Wenn jemand eine veröffentlichte Version manipuliert, schlägt der Build fehl.
Immer festschreiben. Es wird automatisch durch go-Befehle aktualisiert.
Wichtige Befehle
go mod init example.com/myapp # create go.mod
go get github.com/google/uuid # add the dep at its latest version
go get github.com/google/uuid@v1.5.0 # specific version
go get -u ./... # upgrade every dep
go mod tidy # remove unused deps, add missing ones
go mod download # download everything into the cache
go mod why github.com/x/y # explain why a dep is included
go mod graph # full dependency graphgo mod tidy ist derjenige, den Sie nach jeder Änderung an Importen ausführen: Er garantiert, dass go.mod genau die tatsächlich verwendeten Pakete widerspiegelt.
Semantische Importversionierung (SIV)
Versionen folgen SemVer: v1.2.3 = MAJOR.MINOR.PATCH. Der interessante Teil ist major v2+:
- Major
v0undv1→ normaler Pfad:github.com/foo/bar. - Hauptversion
v2oder höher → der Pfad enthält die Hauptversion:github.com/foo/bar/v2.
import "github.com/foo/bar/v2"Dadurch können Sie v1 und v2 derselben Bibliothek gleichzeitig importieren (nützlich bei progressiven Migrationen).
Pfade und interne Pakete importieren
Wenn Ihr Modul example.com/myapp ist, wird ein utils/-Unterordner importiert als:
import "example.com/myapp/utils"Der Pfad hängt nur vom in go.mod deklarierten Namen ab, nicht vom Speicherort auf der Festplatte: Derselbe Code in einem anderen Ordner funktioniert weiterhin.
Arbeitsbereichsmodus (Go 1.18+)
Um an mehreren Modulen zu arbeiten, die gleichzeitig aufeinander verweisen (z. B. eine Bibliothek und eine App, die sie verwendet):
go work init ./lib ./appDadurch wird go.work erstellt: go build verwendet die lokale Version von ./lib, anstatt die veröffentlichte Version herunterzuladen. go.work nicht festschreiben (es handelt sich um eine Entwicklungsumgebung).
Übungen
Das Modul heißt example.com/myapp und enthält einen Unterordner „utils“. Importieren Sie das Unterpaket unter Verwendung des vollständigen Pfads in main.
Hinweis anzeigen
Der Importpfad ist der Modulname (von go.mod) plus der relative Pfad des Ordners.
Lösung nach 3 Versuchen verfügbar
Wandeln Sie die einzelnen Importe mit der Syntax import ( ... ) in eine Importgruppe um und importieren Sie dabei sowohl fmt als auch os.
Lösung nach 3 Versuchen verfügbar
Welcher Befehl entfernt nicht mehr importierte Abhängigkeiten aus go.mod und fügt die fehlenden hinzu?
$ go mod ???