Go-Module sind der Standardmechanismus zur Verwaltung von Abhängigkeiten, der in Go 1.11+ eingeführt wurde. Die Hauptdateien sind go.mod (definiert minimale Abhängigkeiten und deren Versionen) und go.sum (garantiert die Integrität durch Hashes).
Zum Hinzufügen einer Abhängigkeit wird verwendet:
go get github.com/pkg/errors@v0.9.1
Zum Aktualisieren von Abhängigkeiten —
go get -u ./... go mod tidy # ungenutzte entfernen
Go unterstützt semantische Versionierung (semver), und Abhängigkeiten werden streng festgelegt: das Projekt ist reproduzierbar, der Build ist deterministisch. Es sollte jedoch beachtet werden:
Was passiert, wenn die Datei go.sum gelöscht wird und der Befehl go build ausgeführt wird, und warum ist das gefährlich?
Viele glauben, dass Go einfach die Abhängigkeiten von Grund auf neu bauen wird. Aber die Datei go.sum enthält Hashes aller verwendeten Module und schützt vor Modifikationen (Supply-Chain-Angriff). Wenn sie gelöscht wird,
lädt Go beim nächsten Build die Abhängigkeiten erneut herunter, erstellt die Datei neu, aber wenn das Abhängigkeits-Repository von einem Angreifer verändert wurde — ist der Schutz gebrochen! Es besteht die Möglichkeit der Code-Manipulation in der Produktion.
Geschichte
In einem großen Projekt wurde das Repository von Vendoring auf Go-Module umgestellt, die Versionen wurden nicht festgelegt. Nach einem Monat brachen Aktualisierungen externer Pakete die Kompatibilität, es war unmöglich, den alten Branch zu bauen — der Code verlor seine Reproduzierbarkeit.
Geschichte
In einem anderen Projekt hat ein Entwickler versehentlich go.sum gelöscht. Nach dem erneuten Ausführen bemerkte das Team, dass sich einige Abhängigkeiten geändert hatten, es traten Fehler auf, die mit der Inkompatibilität von Minor-Versionen verbunden waren — daraus ergab sich ein Rückschritt um mehrere Tage.
Geschichte
Die Verwendung von Replace-Pfaden für lokale Verzeichnisse (replace ... = ../some/library) wurde vor dem Deployment nicht entfernt — im CI/CD-Pipeline schlug der Build fehl, da das externe System keinen Zugriff auf lokale Dateien hatte, und die Produktion war auf einer falschen Version "festgefahren".