So führen Sie ein bestimmtes Tag eines Github-Repositorys aus

89

Ich versuche, die InfluxDB-Datenbank (Version v0.8.8) mit zu kompilieren go get github.com/influxdb/influxdb

Aber das zieht den Hauptzweig, und ich brauche das v0.8.8Tag.

Ich habe versucht zu tun: go get github.com/influxdb/influxdb/releases/tag/v0.8.8aber dies schlägt fehl zu sagen, nicht zu finden.

Ich habe auch versucht, eine reguläre Version go getdes Master-Zweigs zu erstellen und dann das Tag manuell mit gitin GOPATH/src/github...auszuchecken, um die Corret-Version festzulegen.

Das Problem beim letzten Ansatz ist, dass beim Versuch, die Abhängigkeiten go get -u -f ./...damit zu ziehen , versucht wird, sie im Hauptzweig zu finden, und einige davon nicht im Hauptzweig vorhanden sind ...

TL; DR : go getFühren Sie ein bestimmtes Github-Tag aus und ziehen Sie die richtigen Abhängigkeiten.

ESala
quelle
Versuchen Sie dies .. git tag -a v0.8.8 - "Ihr Kommentar"
Ashok Londhe
2
@AshokLondhe Er fragt, wie man ein Tag verwendet go get, nicht wie man eines erstellt.
Wunder
@ Wonderb0lt Dies ist der Befehl zum Hinzufügen eines Tags.
Ashok Londhe
Ich glaube, ich habe versucht herauszufinden, wie man ein bestimmtes Tag überprüft, und das letzte Mal, als ich es versuchte, war es nicht möglich ...
wunderb0lt
1
Werfen Sie einen Blick auf diese . Gegen Ende bieten die Folien einige Alternativen für das Abhängigkeitsmanagement.
Wunder

Antworten:

34

Es ist nicht möglich, das go getTool zu verwenden. Stattdessen müssen Sie ein Go-Paketverwaltungstool eines Drittanbieters verwenden oder eigene Gabeln für die Pakete erstellen, die Sie feinkörniger verwalten möchten.

Er sprach mit einem Mitarbeiter von Google und erkannte dieses Problem / diese Anforderung an. Er sagte, das von seinem Team verwendete Vendoring sei sperrig und werde wahrscheinlich bald mit den offiziellen Tools gelöst.

Weiterlesen:

Vendoring in Go 1.6

Vendoring wurde von Experiment in Go 1.6 (nachdem dieser Beitrag ursprünglich geschrieben wurde) freigegeben , wodurch die Verwendung bestimmter Tags / Versionen von Paketen mit Tools von Drittanbietern vereinfacht wird. go getverfügt immer noch nicht über die Funktionalität zum Abrufen bestimmter Tags oder Versionen.

Weitere Informationen zur Funktionsweise von Vendoring: Verstehen und Verwenden des Vendor-Ordners

Module in Go 1.11

Go 1.11 hat eine experimentelle Funktion namens Module veröffentlicht, um das Abhängigkeitsmanagement zu verbessern. Sie hoffen, sie in Go 1.12 als stabil zu veröffentlichen: Informationen zu Modulen in Go 1.11

Robin Andersson
quelle
1
Können Sie etwas mehr über den Google-Teil erzählen? Es gibt eine große Diskussion darüber auf der Mailingliste der Go-Community. Gibt es eine andere Richtung, die dort nicht besprochen wurde?
Not_a_Golfer
1
@Not_a_Golfer Es war ein Typ, der nicht Teil des Go-Teams war, aber darüber sprach, dass sie derzeit intern Vendoring verwenden und dass es ziemlich sperrig war. Sie hatten also ein Interesse daran, es mit den offiziellen Tools besser zu lösen. Ich denke, es war eine inoffizielle Aussage, die das klarer machen wird.
Robin Andersson
2
AFAIK, der einzige Vorschlag ist ein offizielles Hersteller- / Abhängigkeitsdateiformat. Dies ist immer noch großartig, da Projekte nicht an ein Abhängigkeitstool gebunden sind und mit jeder gewünschten Lösung zusammenarbeiten können (dh ich bevorzuge das Sperren von Revisionen, während andere das Vendoring bevorzugen).
JimB
Module befassen sich nicht wirklich mit der Abhängigkeit von Code-Compilern, was uns zwingt, go get protoc-gen-go mit der Fix-Version woanders zu verwenden. Daher müssen wir die gleiche Versionierung an zwei verschiedenen Stellen verfolgen (da die Bibliotheken eng mit dem Generator verbunden sind)
Martin Kosicky,
23

go mod ist ab sofort verfügbar.

Für diejenigen, die eine Binärdatei eines bestimmten Tags erstellen müssen , ist hier mein Weg:

mkdir temp
cd temp
go mod init .
go get -d -v github.com/nsqio/nsq@v1.1.0
mkdir bin
go build -o bin/nsqd.exe github.com/nsqio/nsq/apps/nsqd

Erläuterung:

  • Der obige Code zieht NSQ v1.1.0 und erstellt nsqd.
  • go mod init .Erstellt eine go.modDatei im aktuellen Verzeichnis, die die Verwendung go getmit Revision / Tags ermöglicht. (siehe diesen Link )
  • -d bedeutet "nur herunterladen". Wenn Sie eine direkte Installation wünschen, lassen Sie dieses Flag und die Build-Befehle unter dieser Zeile weg.
  • -v bedeutet "wortreich sein".
  • Der obige Code ist für Windows. Wenn Sie Linux verwenden, ersetzen Sie bin/nsqd.exedurch bin/nsqd.

Das heruntergeladene Modul wird in gespeichert %GOPATH%\pkg\mod. Wenn Sie Ihr GOPATHVerzeichnis nicht verschmutzen möchten, erstellen Sie ein neues und stellen Sie GOPATHes ein.

brk
quelle
3
In go 1.13 go mod initbenötigt das eine Modul-ID, zBgo mod init local/build
archie
11

Ich hatte Erfolg damit:

  • Führen Sie den Befehl get ohne das Tag aus - er sollte den Hauptzweig klonen.
  • Wechseln Sie in das Klonverzeichnis und checken Sie das gewünschte Tag oder den gewünschten Zweig aus.
  • Führen Sie den Befehl go get erneut aus. Er sollte den Befehl im ausgecheckten Zweig verarbeiten.
Gregory Russell
quelle
4
Beim ersten Durchlauf können Sie go get -d <git-url>einfach die Pakete herunterladen und die Installation überspringen.
Webwurst
Dies sollte verwendet werden, wenn Sie ein bestimmtes Tag benötigen. Die Datei gopkg.in ist zu restriktiv.
Hrishikesh Kumar
3

Diese Frage ist älter als Go-Module, aber zum späteren Nachschlagen lautet das korrekte Verfahren in Go 1.11 zum Abrufen einer bestimmten Version wie folgt:

go get github.com/influxdb@[version]

Oder um ein bestimmtes Git-Tag zu erhalten:

go get github.com/influxdb@[gitref]

Emidander
quelle
1

Ich habe einen (etwas hackigen, aber funktionierenden) Ansatz, um dieses Problem zu lösen, zumindest für Git-Repositorys: Da Go-Get'ed-Pakete normale Quellcodeverwaltungs-Repositorys sind, kann man Tags mit normalen Git-Tools auschecken (könnte Git über die Befehlszeile verwenden , Ich benutze Atlassian SourceTree).

Um meine Paketkonfiguration mit meinen Teamkollegen zu teilen, habe ich aus meinem GOPATH ein Git-Repository erstellt . Ich habe dann alle Pakete (zumindest die, die ich auf diese Weise verwalten wollte) zu diesem Repo als Git-Submodul hinzugefügt. Dies erfordert, dass Sie die vorhandenen Repo-Ordner aus dem Weg räumen und sie erneut als Git-Submodul hinzufügen, um Git nicht zu verwirren. Dieser Prozess ist etwas langwierig, hat sich aber als die Mühe wert erwiesen:

Ich kann jetzt jedes Mal, wenn ich ein neues Go-Paket verwende, ein Commit durchführen und auf mein GOPATH-Repo pushen. Wenn meine Teamkollegen aus diesem Repo aussteigen und ein Git-Submodul-Update herausgeben (oder einfach über SoureTree aktualisieren, was dies automatisch tut), wird ihre Version des Pakets auf demselben Tag wie meines ausgecheckt.

Dies funktioniert natürlich nur für Pakete unter Git-Quellcodeverwaltung ...

Peter Hommel
quelle