Wie kann die Abhängigkeit des Go-Moduls in go.mod auf ein aktuelles Commit in einem Repo verweisen?

104

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.modund go.sumDateien, 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.0entspricht nicht dem zuletzt veröffentlichten Release-Tag, 20181121201909wäre ein Commit-Zeitstempel und af044c0995fewäre der Commit-Hash? Sollten solche Informationen von Hand gefunden und eingegeben werden, oder gibt es einen besseren Weg?

dimus
quelle

Antworten:

159

Holen Sie sich einfach den gewünschten Commit-Hash:

go get github.com/someone/some_module@af044c0995fe

'go get' aktualisiert die Abhängigkeitsdateien korrekt (go.mod, go.sum).

Weitere Informationen: https://github.com/golang/go/wiki/Modules#how-to-upgrade-and-downgrade-dependencies

Everton
quelle
4
Falls der Fehler " unbekannte Revision " oder " ungültige Version " angezeigt wird - Stellen Sie sicher, dass Sie keinen PR-Hash angegeben haben (Pull-Anfrage). Sogar eine zusammengeführte PR könnte falsch sein. Suchen Sie nach dem Commit-Hash im Repo unter /commits, aber nicht unter /pulls. Weitere Informationen finden Sie hier: golang / go # 31191 filtert diese Art von Commits explizit heraus.
Noam Manos
1
Das OP fragt, wie man es zur go.mod-Datei hinzufügt, nicht wie man eingo get
Nulik
2
@Nulik go getist der richtige Weg, um auf go.moddie vom OP angeforderte Weise zu aktualisieren / zu ergänzen .
Dave C
95

Zusätzlich zur Antwort von Everton auf die Verwendung go get github.com/someone/some_module@af044c0995fezum 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.modDatei aufgezeichnet , z v0.0.0-20171006230638-a6e239ea1c69. (Dies hilft bei der Bereitstellung einer einfachen Gesamtbestellung für alle Versionen basierend auf der Standard- Semver- Reihenfolge.)

typisch182
quelle
9
danke für die pseudo-version erklärung. Ich habe versucht, replaceeine 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 angeben replace 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@commithashund replace github.com/original/somelib => github.com/fork/somelib commithashnicht arbeiten
Zhandos Zhylkaidar
6

Ich 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

go env -w GO111MODULE = on

danach werden wir in der Lage sein zu tun

go get repo@branchname
go get repo@tag
go get repo@commithash
Chaitanya Gadkari
quelle
2

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 replaceam Ende der go.modDatei 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
dimus
quelle
0

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:

module /my/module

require (
...
github.com/someone/some_module latest
...
)

wird werden

module /my/module

require (
...
github.com/someone/some_module v2.0.39
...
)

nach dem Rennen go mod tidy

JFW
quelle