Ab Version 1.11 Go wurde Unterstützung für Module hinzugefügt. Befehle
go mod init <package name>
go build
würde generieren go.mod
und go.sum
Dateien, die alle gefundenen Versionen für die Paketabhängigkeiten enthalten.
Wenn ein Modul keine Releases hat, wird das neueste Commit dieses Moduls verwendet. Wenn ein Modul Releases hat, wird das neueste als Abhängigkeit ausgewählt.
Manchmal benötige ich jedoch Funktionen, die noch nicht in einer veröffentlichten Version enthalten sind, sondern aus einem nach dieser Version vorgenommenen Commit. Wie kann ich festlegen go.mod
, dass nicht auf eine Version eines Moduls, sondern auf ein bestimmtes Commit im Repository des Moduls verwiesen wird?
Es sieht so aus, als ob ich es in go.mod mit von Hand machen kann
module /my/module
require (
...
github.com/someone/some_module v0.0.0-20181121201909-af044c0995fe
...
)
Wo v0.0.0
entspricht nicht dem zuletzt veröffentlichten Release-Tag, 20181121201909
wäre ein Commit-Zeitstempel und af044c0995fe
wäre der Commit-Hash? Sollten solche Informationen von Hand gefunden und eingegeben werden, oder gibt es einen besseren Weg?
/commits
, aber nicht unter/pulls
. Weitere Informationen finden Sie hier: golang / go # 31191 filtert diese Art von Commits explizit heraus.go get
go get
ist der richtige Weg, um aufgo.mod
die vom OP angeforderte Weise zu aktualisieren / zu ergänzen .Zusätzlich zur Antwort von Everton auf die Verwendung
go get github.com/someone/some_module@af044c0995fe
zum Abrufen eines bestimmten Commits können Sie auch Zweignamen verwenden, z.go get github.com/someone/some_module@master
go get github.com/someone/some_module@dev_branch
Diese Beispiele erhalten das neueste Commit für den entsprechenden Zweig.
Es wird weiterhin als Pseudoversion in Ihrer
go.mod
Datei aufgezeichnet , zv0.0.0-20171006230638-a6e239ea1c69
. (Dies hilft bei der Bereitstellung einer einfachen Gesamtbestellung für alle Versionen basierend auf der Standard- Semver- Reihenfolge.)quelle
replace
eine temporäre Abzweigung einer Abhängigkeit zu verwenden, konnte aber keinen Weg finden, diesen Ersatz so zu gestalten, dass er auf ein Commit hinweist. Musste ein Versions-Tag erstellen und es so angebenreplace github.com/original/somelib => github.com/fork/somelib v1.2.3
, was ein bisschen zu viel ist, wenn ich nur schnell etwas testen möchte.replace github.com/original/somelib => github.com/fork/somelib@commithash
undreplace github.com/original/somelib => github.com/fork/somelib commithash
nicht arbeitenIch habe mir seit einiger Zeit den Kopf geschlagen, wie es für alle funktioniert, und ich bin nicht in der Lage, es auszuführen. Für mich musste ich mich zum Master Branch verpflichten, dann konnte nur ich es bekommen.
Um mit einem bestimmten Zweig, einer bestimmten Festschreibungs-ID oder einem bestimmten Tag arbeiten zu können, müssen Sie ein Flag für das go-Modul aktivieren, indem Sie den folgenden Befehl ausführen
danach werden wir in der Lage sein zu tun
go get repo@branchname go get repo@tag go get repo@commithash
quelle
Wenn Sie vorübergehend eine Abhängigkeit von einem lokalen Verzeichnis ersetzen möchten (z. B. wenn Sie gleichzeitig an 2 Modulen arbeiten), können Sie
replace
am Ende dergo.mod
Datei eine Anweisung hinzufügen :module example.com/mypkg go 1.15 require ( gitlab.com/someone/a_package v0.14.2 ) replace gitlab.com/someone/a_package => ../my_forks/a_package
quelle
Auch wenn Sie das Wort "Neueste" anstelle des Tags in die Datei "go.mod" einfügen, wird es in das neueste Tag der Module geändert.
Zum Beispiel:
wird werden
module /my/module require ( ... github.com/someone/some_module v2.0.39 ... )
nach dem Rennen
go mod tidy
quelle