Was ist der Unterschied zwischen go get und go install?

81

Nachdem Sie goeine Weile mit dem Tool gespielt haben, sieht es so aus go get:

  1. (optional) Downloads,
  2. kompiliert,
  3. und installiert

ein Stück Software, während go installeinfach

  1. kompiliert
  2. und installiert

es. Warum go installexistiert in diesem Fall der Befehl, da go geter ihn ersetzt?

thiagowfx
quelle

Antworten:

75

go installist Teil des Workflows bei lokaler Arbeit. Angenommen, Sie möchten eine Bibliothek verwenden, aber aus irgendeinem Grund ist eine Änderung erforderlich. Du würdest:

  • go get -d library, die es nur herunterlädt;
  • Nehmen Sie die Änderung am heruntergeladenen Paket vor.
  • go install library um die lokale Version zu installieren.

Soweit ich weiß go get, gibt es keine Flags, die darauf hinweisen, dass es nicht heruntergeladen werden sollte, daher kann es go installhier nicht ersetzt werden.

Der gleiche Workflow wird verwendet, wenn Sie ein neues Paket von Grund auf neu entwickeln.

BoppreH
quelle
1
Schön, ich glaube ich verstehe jetzt dank Ihres ersten Beispiels. In Ihrem zweiten (Entwicklung eines neuen Pakets von Grund auf neu) könnte ich es jedoch auch verwenden go get ./path/to/local_package, und es würde sich genauso verhalten, als ob ich es verwendet hätte go install ./path/to/local_package, oder? Da es in diesem Fall keinen Download-Prozess gibt.
Thiagowfx
go installmacht Ihr Ziel deutlicher, aber ich nehme an, beide würden dasselbe erreichen. Ich habe mit ein paar Paketen getestet, einschließlich solcher, die als maingleichwertig deklariert wurden . Die Dokumente zu diesem Befehl fehlen sehr.
BoppreH
Hier heißt es, du brauchst gcc für, go getaber nicht für go install. Wie hängt das mit dieser Beschreibung zusammen?
AndreKR
3
Ich bin mit dieser Antwort nicht einverstanden. Sie können go getstatt go installin Ihrem dritten Aufzählungspunkt auch verwenden, da go getdie Bibliothek nicht erneut heruntergeladen wird (es sei denn, Sie fügen hinzu -u). Sie können es auch verwenden, go getwenn Sie eine Bibliothek von Grund auf neu schreiben. go installscheint völlig überflüssig.
Simon
34

go get macht zwei Hauptaufgaben in dieser Reihenfolge:

  • lädt dann die in $GOPATH/src/<import-path>den Importpfaden genannten Pakete (Quellcode) und deren Abhängigkeiten herunter und speichert sie

  • führt a aus go install

Das -dFlag ( go get -d) weist go getan, nach dem Herunterladen der Pakete anzuhalten. das heißt, es weist go getan, dies nicht zu tungo install


der Unterschied:

go get // Überprüfen Sie, ob Pakete heruntergeladen werden müssen, laden Sie sie bei Bedarf herunter und kompilieren Sie sie

go install // überspringe den Teil mit dem Download von Paketen, kompiliere einfach (dies wird einen Fehler auslösen, wenn irgendwelche Pakete fehlen)


über GOPATHUmgebungsvariable

Die GOPATHUmgebungsvariable wird von den Go-Tools verwendet. Es muss festgelegt werden, um in der Lage zu sein get, buildund installPakete, und es gibt den Speicherort Ihres Arbeitsbereichs an. Dies ist wahrscheinlich die einzige Umgebungsvariable, die Sie bei der Entwicklung von Go-Code festlegen müssen.

Auch hier GOPATHsollte das nicht auf die Go-Installation verweisen, sondern auf Ihren Arbeitsbereich.

Wenn Sie beispielsweise unter Windows entscheiden, dass sich Ihr Arbeitsbereich in befindet c:\gowork\, müssen Sie den GOPATHWert als festlegenc:\gowork

Geben Sie hier die Bildbeschreibung ein

Ihr Quellcode sollte sich an befinden c:\gowork\src\<some project folder>\und nachdem Sie go getan der Eingabeaufforderung von innen ausgeführt c:\gowork\src\<some project folder>\haben, sehen Sie das c:\gowork\bin\und c:\gowork\pkg\wird erstellt.

Alex Baban
quelle
go installlädt das Paket in modulabhängiger Konfiguration herunter.
Berkant Ipek
0

Beachten Sie, dass go 1.16 (Q1 2021) diesen Unterschied deutlicher macht und mit CL 266360 als Teil von Ausgabe 40276 implementiert wurde :

go installAkzeptiert jetzt Argumente mit Versionssuffixen (zum Beispiel go install example.com/[email protected]).
Dies führt go installdazu , dass Pakete im modulsensitiven Modus erstellt und installiert werden , wobei die go.modDatei im aktuellen Verzeichnis oder in einem übergeordneten Verzeichnis, falls vorhanden , ignoriert wird.
Dies ist nützlich, um ausführbare Dateien zu installieren, ohne die Abhängigkeiten des Hauptmoduls zu beeinflussen .

go install, mit oder ohne Versionssuffix (wie oben beschrieben), ist jetzt die empfohlene Methode zum Erstellen und Installieren von Paketen im Modulmodus.

go getsollte mit dem -dFlag verwendet werden, um die Abhängigkeiten des aktuellen Moduls anzupassen, ohne Pakete zu erstellen , und die Verwendung von go getzum Erstellen und Installieren von Paketen ist veraltet .
In einer zukünftigen Version wird das -dFlag immer aktiviert sein .

VonC
quelle