Ich versuche, mein benutzerdefiniertes Paket für meine main.go-Datei 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?
Überprüfen Sie Ihre Variable GOPATH
.
Stelle sicher:
- ihre Quellen sind unter
GOPATH/src
- sie haben einen
bin
-Ordner in Ihrem GOPATH-Ordner.
Siehe GOPATH-Umgebungsvariable (wobei 'DIR' ein GOPATH
-Ordner ist):
Das
bin
-Verzeichnis enthält kompilierte Befehle.
Jeder Befehl wird nach seinem Quellverzeichnis benannt, aber nur das letzte Element, nicht der gesamte Pfad. Das heißt, der Befehl mit der Quelle inDIR/src/foo/quux
wird inDIR/bin/quux
installiert, nicht inDIR/bin/foo/quux
. Das Präfix "foo/
" wird entfernt, sodass SiePATH
DIR/bin
hinzufügen können, um die installierten Befehle abzurufen.Wenn die Umgebungsvariable
GOBIN
gesetzt ist, werden Befehle in dem Verzeichnis installiert, in dem sie nichtDIR/bin
heißt.GOBIN
muss ein absoluter Pfad sein.
Zum Beispiel dieser Thread zeigt, was passiert, wenn ein Go-Build außerhalb von GOPATH/src
ausgeführt wird:
Anscheinend ist
GOPATH
auf~/go
eingestellt, aber Sie haben den Befehlgo install
für~/dev/go
ausgeführt.
Siehe Go Build
Der Go-Pfad ist eine Liste von Verzeichnisbäumen, die Go-Quellcode enthalten. Es wird konsultiert, um Importe zu beheben, die nicht im Standard-Go-Baum gefunden werden können.
Wenn Sie go build
getan haben, können Sie auch einen go install
(kein custom.go
) versuchen: Sie möchten das Paket installieren, nicht eine einzelne Datei.
Ich habe den GOBIN-Pfad festgelegt und das hat für mich funktioniert
export GOBIN=[WorkspacePath]/bin
Als Anfänger bin ich auf diesen Fehler gestoßen, als ich verschiedene go-Befehle ausprobierte (build, run und install). Kurz gesagt, Sie können go nicht installieren a 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 install nicht funktioniert:
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 mich befand:
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 darauf zurückzuführen, dass go runnur mit Go-Quelldateien (Dateinamen, die auf .go enden) und go installnur Pakete verwendet. Pakete werden nach Importpfaden oder Dateisystempfad benannt. Somit:
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. Ersteres bezieht sich auf das Paket nach Importpfad (da $ GOPATH = "/ home/nate/work" ist, suchen die Go-Tools nach Quellcode in/home/nate/work/src), die anderen werden als Dateisystem interpretiert Pfade wegen der führenden Perioden.
Siehe auch die GOPATH-Dokumente .
Tatsächlich gibt es zwei verschiedene Verhaltensweisen.
go install <package>
dies ist dokumentiert in Kompilieren und Installieren von Paketen und Abhängigkeiten Sie benötigen GOBIN nicht, wenn Sie GOPATH richtig einstellen.
go install <gofile>
dies ist nicht dokumentiert, und Sie benötigen in diesem Modus eine GOBIN-Umgebungsvariable.
Unter Windows mit Cygwin scheint es eine gute Idee zu sein, GOBIN auf $ GOPATH/bin einzustellen.
denken Sie daran, das Trennzeichen der Windows-Dateinamen ordnungsgemäß zu schützen:
$ echo $GOROOT
C:\Go\
[email protected] ~/gocode/src/github.com/user/hello
$ echo $GOPATH
C:\cygwin64\home\carl\gocode
[email protected] ~/gocode/src/github.com/user/hello
$ echo $GOBIN
C:\cygwin64\home\carl\gocode\bin
Wie die durchgängigen Antworten gezeigt haben, 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 halten Sie nach GOROOT und GOPATH Ausschau, um zu überprüfen, ob GOROOT auf Ihre GO-Quellinstallation und GOPATH auf Ihren Arbeitsbereich zeigt.
Wenn alles in Ordnung ist, navigieren Sie zu dem Unterverzeichnis, in dem sich yourpkg.go befindet, und führen Sie zuerst $ go build (ohne Dateinamen) und dann $ go install (erneut ohne Dateinamen) aus, wenn keine Fehlermeldung auf dem Bildschirm angezeigt wird Paket ist fertig in Ihrem Arbeitsbereich/pkg/youros /../ yourpackage.a
Suchen Sie für *nix
system, wo go
installiert ist, und führen Sie den folgenden Befehl aus:
$ which go
welche Ausgabe lassen Sie uns sagen:
/usr/local/go/bin/go
fügen Sie dann folgende Einträge in ~/.bash_profile
oder in ~/.zshrc
hinzu:
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
P.S: Vergiss nicht, ~/.bash_profile
oder ~/.zshrc
wie folgt zu quellen:
$ source ~/.bash_profile
Sie benötigen $ GOBIN nicht, wenn Sie $ GOPATH richtig gesetzt haben. Wenn ja, überprüfen Sie einfach, ob sich Ihr Projekt im Ordner $ GOPATH/src befindet.
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 von ihr angegebenen Verzeichnis anstelle von DIR/bin installiert. 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 weiterhin heruntergeladene Abhängigkeiten (in GOPATH/pkg/mod) und installierte Befehle (in GOPATH/bin, sofern GOBIN nicht festgelegt ist).
Grundsätzlich können Sie also GOBIN verwenden, um den Standardspeicherort für die binäre Installation (z. B. $GOPATH/bin
) vorübergehend oder dauerhaft zu überschreiben. Ich hatte Erfolg bei der Installation eines 1-File-Go-Skripts mit env GOBIN=$HOME/bin/ go install testfile.go
. Dies geschah mit go v1.11.
In Bezug auf die Einstellung von GOBIN
variablen Version ist dies nicht erforderlich und nur auf GOPATH
angewiesen:
GOBIN
ist erforderlich, wenn wir kein Paket haben, d. h. die Datei befindet sich direkt im Verzeichnis GOPATH
. Dies ist wahrscheinlich, wenn wir die Go-Funktionen als Lernende ausprobieren
Bei typischen Go-Projekten befinden sich die Dateien in den Paketverzeichnissen. Für diese ist GOPATH
gut genug.
Mit anderen Worten, die beiden folgenden Lösungen funktionieren: ein. Setze GOBIN
explizit als $ GOPATH/bin [nur für Lernzwecke, kann vermieden werden] b. Erstellen Sie ein Unterverzeichnis, das Ihrem Paketnamen entspricht, und verschieben Sie die .go-Dateien in dieses Verzeichnis
Ich denke, Go-Dienstprogramme sollten den obigen Fehler entfernen und das Szenario besser behandeln - basierend darauf, ob das Argument ein Verzeichnis oder eine Quelldatei ist