it-swarm.com.de

Go build: "Kann Paket nicht finden" (obwohl GOPATH gesetzt ist)

Obwohl ich GOPATH richtig eingestellt habe, kann ich immer noch nicht "go build" oder "go run" bekommen, um meine eigenen Pakete zu finden. Was mache ich falsch?

$ echo $GOROOT
/usr/local/go

$ echo $GOPATH
/home/mitchell/go

$ cat ~/main.go
package main
import "foobar"
func main() { }

$ cat /home/mitchell/go/src/foobar.go
package foobar

$ go build main.go
main.go:3:8: import "foobar": cannot find package
107
MitchellSalad

Dies funktioniert nicht, da sich Ihre foobar.go - Quelldatei nicht in einem Verzeichnis mit dem Namen foobar befindet. go build Und go install Versuchen, Verzeichnisse und keine Quelldateien zuzuordnen.

  1. Setzen Sie $GOPATH Auf ein gültiges Verzeichnis, z. export GOPATH="$HOME/go"
  2. Bewegen Sie foobar.go Zu $GOPATH/src/foobar/foobar.go Und das Erstellen sollte gut funktionieren.

Zusätzliche empfohlene Schritte:

  1. Fügen Sie $GOPATH/bin Zu Ihrem $PATH Hinzu durch: PATH="$GOPATH/bin:$PATH"
  2. Verschieben Sie main.go In einen Unterordner von $GOPATH/src, Z. $GOPATH/src/test
  3. go install test Sollte nun eine ausführbare Datei in $GOPATH/bin Erstellen, die durch Eingabe von test in Ihr Terminal aufgerufen werden kann.
138
fasmat

Edit: da du GOPATH gemeint hast, siehe fasmat 's answer (upvoted)

Wie in " Wie kann ich mein Paket finden? " erwähnt, müssen Sie ein Paket xxx in ein Verzeichnis xxx stellen.

Siehe die Go language spec :

package math

Eine Reihe von Dateien, die dasselbe PackageName verwenden, bilden die Implementierung eines Pakets.
Eine Implementierung erfordert möglicherweise, dass sich alle Quelldateien für ein Paket in demselben Verzeichnis befinden.

Die Code Organisation erwähnt:

Wenn Sie ein Programm erstellen, das das Paket "widget" importiert, sucht der Befehl go im Stammverzeichnis nach src/pkg/widget. Wenn die Paketquelle dort nicht gefunden wird, wird der Befehl ausgeführt. Es sucht nach src/widget in jedem Arbeitsbereich in der angegebenen Reihenfolge.

(Ein "Arbeitsbereich" ist ein Pfadeintrag in Ihrem GOPATH: Diese Variable kann auf mehrere Pfade verweisen, damit Ihr 'src, bin, pkg'


(Originalantwort)

Sie sollten auch GOPATH auf ~/go setzen, nicht GOROOT, wie in " How to Write Go Code " dargestellt.

Der Go-Pfad wird zum Auflösen von Importanweisungen verwendet. Es wird von go/build implementiert und im Paket dokumentiert.

Die Umgebungsvariable GOPATH listet Stellen auf, an denen nach Go-Code gesucht werden soll.
Unter Unix ist der Wert eine durch Doppelpunkte getrennte Zeichenfolge.
Unter Windows ist der Wert eine durch Semikolon getrennte Zeichenfolge.
In Plan 9 ist der Wert eine Liste.

Das ist anders als GOROOT:

Die Go-Binärdistributionen setzen voraus, dass sie in /usr/local/go (Oder c:\Go Unter Windows) installiert werden. Sie können jedoch auch an einem anderen Speicherort installiert werden.
In diesem Fall müssen Sie die Umgebungsvariable GOROOT auf dieses Verzeichnis setzen, wenn Sie die Go-Tools verwenden.

9
VonC

TL; DR: Befolgen Sie die Go-Konventionen! (Lektion auf die harte Tour gelernt), auf alte Go-Versionen prüfen und entfernen sie. Neueste installieren.

Für mich war die Lösung anders. Ich habe auf einem gemeinsam genutzten Linux-Server gearbeitet und nach mehrmaliger Überprüfung meiner GOPATH und anderer Umgebungsvariablen funktionierte dies immer noch nicht. Ich habe verschiedene Fehler festgestellt, darunter "Paket kann nicht gefunden werden" und "Unbekannter Importpfad". Nach dem Versuch, mit this Lösung durch die Anweisungen auf golang.org (einschließlich des ninstall Teils) neu zu installieren, traten immer noch Probleme auf.

Ich habe einige Zeit gebraucht, um festzustellen, dass es noch eine alte Version gibt, die nicht deinstalliert wurde (mit go version dann which go wieder ... DAHH) was mich dazu brachte dies zu fragen und endlich zu lösen.

3
Moshisho