GOBIN nicht gesetzt: go install kann nicht ausgeführt werden

85

Ich versuche, mein benutzerdefiniertes Paket für meine Datei main.go zu installieren. Als ich jedoch rannte

go install custom.go

Ich habe diesen Fehler bekommen

go install: no install location for .go files listed on command line (GOBIN not set)

Wie stelle ich GOBIN ein?

user3918985
quelle
15
Übrigens: Dies ist ein völlig falscher Weg, um ein Paket zu installieren. Das wird niemals funktionieren. go installInstalliert Pakete, nicht einzelne Dateien. Bitte lesen Sie golang.org/cmd/go und sehen Sie, wie Sie Ihre Dateien einrichten.
Volker
Danke für die Warnung!
user3918985
2
Ich denke, Sie suchen Go Build.
Bunnybare
2
Ich bin mir nicht sicher, ob ich damit einverstanden bin, dass es völlig falsch ist. Wenn GOBIN festgelegt ist, gibt es zwei unterschiedliche Verhaltensweisen: Bei Verwendung von go build <gofile.go> wird die ausführbare Datei im selben Ordner erstellt. Bei Verwendung von go install <gofile.go> wird die ausführbare Datei in GOBIN erstellt.
Erez A. Korn
2
FWIW - Die Standarddokumente für den Einstieg empfehlen, genau dies zu tun. golang.org/doc/install
Mike Buckbee

Antworten:

45

Überprüfen Sie Ihre GOPATHVariable.
Stelle sicher:

  • Ihre Quellen sind unter GOPATH/src
  • Sie haben einen binOrdner in Ihrem GOPATH-Ordner.

Siehe GOPATH-Umgebungsvariable (wobei 'DIR' ein GOPATHOrdner ist):

Das binVerzeichnis enthält kompilierte Befehle.
Jeder Befehl wird nach seinem Quellverzeichnis benannt, aber nur nach dem letzten Element, nicht nach dem gesamten Pfad. Das heißt, in dem Befehl mit Quelle DIR/src/foo/quuxin installiert ist DIR/bin/quux, nicht DIR/bin/foo/quux. Das foo/Präfix " " wird entfernt, damit Sie es DIR/binzu Ihrem hinzufügen können PATH, um zu den installierten Befehlen zu gelangen.

Wenn die GOBINUmgebungsvariable festgelegt ist, werden Befehle in dem Verzeichnis installiert, das sie anstelle von benennt DIR/bin. GOBINmuss ein absoluter Weg sein.


Dieser Thread zeigt beispielsweise, was passiert, wenn ein Go-Build außerhalb von GOPATH/src:

Sieht so aus, als ob Ihr GOPATHeingestellt ist, ~/goaber Sie haben den go installBefehl ausgeführt~/dev/go

Siehe Go Build

Der Go-Pfad ist eine Liste von Verzeichnisbäumen, die den Go-Quellcode enthalten. Es wird konsultiert, um Importe aufzulösen, die im Standard-Go-Baum nicht gefunden werden können.

Wenn Sie fertig sind go build, können Sie auch ein go install(Nein custom.go) versuchen : Sie möchten das Paket installieren, nicht eine einzelne Datei.

VonC
quelle
meinst du das? Ich habe $ PATH wiederholt und Folgendes erhalten: / Users / apple / bin: / usr / bin: / bin: / usr / sbin: / sbin: / usr / local / bin: / usr / local / git / bin: / usr / local / go / bin: / usr / local / mysql / bin
user3918985
74

Ich habe den GOBIN-Pfad festgelegt und das hat bei mir funktioniert

export GOBIN=[WorkspacePath]/bin
Pratik Goenka
quelle
2
Ja, das ist die richtige Antwort. erstelle / bin in diesem GOPATH
swdev
6
Nach dem Exportpfad habe ich den Fehler erhalten cannot install, GOBIN must be an absolute path:(
lee
@lee Haben Sie ..oder ~in dem von Ihnen angegebenen Pfad verwendet? Ich habe diesen Fehler bekommen und bin einfach zu einem absoluten Pfad wie /home/ben/bin/oder sogar gewechselt $HOME/bin/. Mein voller Befehl war (in Fischschale, gehen Sie v1.11) env GOBIN=$HOME/bin/ go install testfile.go.
Benny Jobigan
40

Als Anfänger bin ich auf diesen Fehler gestoßen, als ich verschiedene go-Befehle ausprobiert habe (Erstellen, Ausführen und Installieren). Kurz gesagt, kann man nicht gehen installiert eine filename.go . Sie können nur ein Paket installieren.

Das war verwirrend, weil ich das gelernt hatte:

nate:~/work/src/dir $ go run hello/hello.go
hello, world.

funktioniert super. Aber ich konnte nicht herausfinden, warum die Installation nicht funktionieren würde:

nate:~/work/src/dir $ go install hello/hello.go 
go install: no install location for .go files listed on command line (GOBIN not set)
nate:~/work/src/dir $ go install hello
can't load package: package hello: cannot find package "hello" in any of:
    /opt/go/src/hello (from $GOROOT)
    /home/ubuntu/work/src/hello (from $GOPATH)

Egal in welchem ​​Verzeichnis ich war:

nate:~/work/src/dir $ cd hello
nate:~/work/src/dir/hello $ go install hello.go 
go install: no install location for .go files listed on command line (GOBIN not set)
nate:~/work/src/dir/hello $ go install hello
can't load package: package hello: cannot find package "hello" in any of:
    /opt/go/src/hello (from $GOROOT)
    /home/ubuntu/work/src/hello (from $GOPATH)

Diese Verwirrung ist, weil nur laufen gehen mit Go-Quelldateien (Dateinamen, die auf .go enden) funktioniert und go install nur Pakete akzeptiert. Pakete werden nach ihren Importpfaden oder dem Dateisystempfad benannt. So:

nate:~/work/src/dir $ go install dir/hello
nate:~/work/src/dir $ go install ./hello/
nate:~/work/src/dir/hello $ go install .

Alle arbeiten großartig. Der erste bezieht sich auf das Paket nach Importpfad (vorausgesetzt, $ GOPATH = "/ home / nate / work", die go-Tools suchen in / home / nate / work / src nach Quellcode), die anderen werden als Dateisystem interpretiert Wege wegen der führenden Perioden.

Siehe auch die GOPATH-Dokumente .

Nate Green
quelle
1
Dies ist die echte Lösung IMO. go installfunktioniert in Verzeichnissen und wenn Sie eine bestimmte go-Datei angeben, kann dies zu diesem bestimmten Problem führen.
Senseiwu
13

Eigentlich gibt es 2 verschiedene Verhaltensweisen.

go install <package>

Dies ist in Kompilieren und Installieren von Paketen und Abhängigkeiten dokumentiert. Sie benötigen GOBIN nicht, wenn Sie GOPATH richtig eingestellt haben.

go install <gofile>

Dies ist nicht dokumentiert und Sie benötigen in diesem Modus die Variable GOBIN env.

PickBoy
quelle
1
go install <gofile>dokumentiert ist, go help packagesauf die sich go install --helpbezieht. Das Problem ist, dass go install(in 1.9.2 und früher) ein inkonsistentes Verhalten vorliegt, in einem Fall erfordert es und in einem anderen erfordert es nicht, dass GOBIN explizit festgelegt wird.
Stevo Slavić
7

Wie bereits erwähnt, müssen Sie die GOBIN-Umgebungsvariable nicht festlegen, wenn Ihre GOPATH-Umgebung korrekt auf Ihren Arbeitsbereich eingestellt ist.

Bitte überprüfen Sie Ihre go-Umgebungsvariablen, indem Sie $ go env | ausführen grep -i "^ GO" und achten Sie auf GOROOT und GOPATH, um zu überprüfen, ob GOROOT auf Ihre GO-Quellinstallation und GOPATH auf Ihren Arbeitsbereich zeigt.

Wenn alles korrekt ist, navigieren Sie zu dem Unterverzeichnis, in dem sich yourpkg.go befindet. Führen Sie dann zuerst $ go build (ohne Dateinamen) und dann $ go install (erneut ohne Dateinamen) aus, wenn auf dem Bildschirm keine Fehlermeldung angezeigt wird Das Paket ist in Ihrem Arbeitsbereich bereit / pkg / youros /../ yourpackage.a

user42754
quelle
7

Unter Windows mit Cygwin scheint es eine gute Idee zu sein, GOBIN auf $ GOPATH / bin einzurichten.

und denken Sie daran, das Windows-Dateinamen-Trennzeichen ordnungsgemäß zu umgehen:

$ echo $GOROOT
C:\Go\

carl@rainier ~/gocode/src/github.com/user/hello
$ echo $GOPATH
C:\cygwin64\home\carl\gocode

carl@rainier ~/gocode/src/github.com/user/hello
$ echo $GOBIN
C:\cygwin64\home\carl\gocode\bin
Carl Binding
quelle
5

Überprüfen Sie für das *nixSystem, wo goes installiert ist, und führen Sie den folgenden Befehl aus:

$ which go

Welche Ausgabe sagen wir:

/usr/local/go/bin/go

Fügen Sie dann folgende Einträge in ~/.bash_profileoder in hinzu ~/.zshrc:

export GOROOT=/usr/local/go
export GOPATH=$GOROOT/src //your-go-workspace
export GOBIN=$GOROOT/bin //where go-generate-executable-binaries

PATH=$PATH:$GOPATH:$GOBIN

export PATH

PS: Vergessen Sie nicht zu beschaffen ~/.bash_profileoder ~/.zshrcwie folgt:

$ source ~/.bash_profile
Arpit Aggarwal
quelle
4
Möchten Sie wirklich, dass ausführbare Entwicklungsdateien abgelegt werden /usr/local/go/bin?
Dolph
1

In Bezug auf die Einstellung der GOBINvariablen Version, die dies nicht erfordert und sich nur auf Folgendes verlässt GOPATH:

  1. GOBINist erforderlich, wenn wir kein Paket haben, dh die Datei befindet sich direkt im GOPATHVerzeichnis. Dies ist wahrscheinlich, wenn wir die Go-Funktionen als Lernende ausprobieren

  2. Bei typischen Go-Projekten befinden sich die Dateien in den Paketverzeichnissen. Für diese GOPATHist gut genug.

  3. Mit anderen Worten, beide der folgenden Lösungen würden funktionieren: a. Stellen Sie GOBINexplizit als $ GOPATH / bin [nur für Lernzwecke, vermeiden kann] b. Erstellen Sie ein Unterverzeichnis, das Ihrem Paketnamen entspricht, und verschieben Sie die .go-Dateien dorthin

  4. Ich denke, Go-Dienstprogramme sollten den obigen Fehler beseitigen und das Szenario besser behandeln - basierend darauf, ob das Argument ein Verzeichnis oder eine Quelldatei ist

pr-pal
quelle
1

In Windows:

go env -w GOBIN=C:\Users\yourname\go\bin

Bestätigen Sie mit dem go envBefehl, dass GOBIN gesetzt ist, und go installspeichern Sie die ausführbare Datei ordnungsgemäß im bin-Verzeichnis.

Frankie Wong
quelle
1

Ich hatte auch die gleichen Probleme (GOBIN muss nicht separat eingestellt werden), stellen Sie sicher, dass Sie die folgenden haben

  1. GOPATH ist gesetzt (dies setzt GOBIN auch automatisch als $ GOPATH / bin)
  2. GOPATH hat die folgenden Verzeichnisse bin, pkg, src
  3. custom.go wird unter src / <Ihr_Modul> platziert
  4. dann renne go install <your_module>
  5. Die Prüfung für die kompilierte Binärdatei (<Ihr_Modul>) finden Sie im Ordner bin
Manjunath Bhadrannavar
quelle
0

Sie brauchen $ GOBIN nicht, wenn Sie $ GOPATH richtig eingestellt haben. Wenn ja, überprüfen Sie einfach erneut, ob sich Ihr Projekt im Ordner $ GOPATH / src befindet .

theVoogie
quelle
0

Von https://golang.org/cmd/go/#hdr-Environment_variables :

GOBIN Das Verzeichnis, in dem 'go install' einen Befehl installiert.

und https://golang.org/cmd/go/#hdr-GOPATH_environment_variable :

Wenn die Umgebungsvariable GOBIN festgelegt ist, werden Befehle in dem Verzeichnis installiert, das sie anstelle von DIR / bin benennt. GOBIN muss ein absoluter Pfad sein.

und https://golang.org/cmd/go/#hdr-Modules__module_versions__and_more

Im modulsensitiven Modus definiert GOPATH die Bedeutung von Importen während eines Builds nicht mehr, speichert jedoch heruntergeladene Abhängigkeiten (in GOPATH / pkg / mod) und installierte Befehle (in GOPATH / bin, sofern GOBIN nicht festgelegt ist).

Grundsätzlich können Sie GOBIN verwenden, um den Standardspeicherort für die binäre Installation (dh $GOPATH/bin) vorübergehend oder dauerhaft zu überschreiben . Ich hatte Erfolg bei der Installation eines 1-Datei-Go-Skripts mit env GOBIN=$HOME/bin/ go install testfile.go. Dies wurde mit go v1.11 durchgeführt.

Benny Jobigan
quelle
0

Für WINDOWS- Benutzer

Öffnen Sie eine Eingabeaufforderung ( Win+ rdann cmdeingeben) oder ein Powershell-Fenster ( Win+ xdann eingeben i).

GOPATH einstellen

HINWEIS: GOPATH darf nicht derselbe Pfad sein wie Ihre Go-Installation.

go env -w GOPATH=c:\your-go-work

Weitere Details finden Sie unter dem folgenden Link: https://github.com/golang/go/wiki/SettingGOPATH#windows

GOBIN einstellen

go env -w GOBIN=C:\somewhere\else\bin

Ich empfehle, das von golang bereitgestellte Codebeispiel zu überprüfen. Es hat mir sehr geholfen. https://golang.org/doc/code.html#Command

Henry
quelle