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
$ go help gopath
Antworten:
Es funktioniert nicht, da sich Ihre
foobar.go
Quelldatei nicht in einem Verzeichnis namens befindetfoobar
.go build
undgo install
versuchen Sie, Verzeichnisse abzugleichen, nicht Quelldateien.$GOPATH
ein gültiges Verzeichnis setzen, zexport GOPATH="$HOME/go"
foobar.go
zu$GOPATH/src/foobar/foobar.go
und Gebäude sollte gut funktionieren.Zusätzliche empfohlene Schritte:
$GOPATH/bin
zu Ihrem$PATH
von:PATH="$GOPATH/bin:$PATH"
main.go
in einen Unterordner von$GOPATH/src
z$GOPATH/src/test
go install test
sollte nun eine ausführbare Datei erstellen$GOPATH/bin
, die durch Eingabetest
in Ihr Terminal aufgerufen werden kann .quelle
GOPATH=/usr/local/go-pkgs
, also sucht Go nach/usr/local/go-pkgs/src/<package-name>
der Quelle,go get
legt sie aber ein/usr/local/go-pkgs/src/gopkg.in/<package-name>
. Warum sollte ich alle meine Pakete nach der Installation manuell verschieben müssen? Das ist einfach albern.go get
normalerweise setzt Pakete in$GOPATH/src/
so , wenn Sie nennengo get domain.com/path/to/package
es in enden wird$GOPATH/src/domain.com/path/to/package
. Ich denke du versuchst ein Paket von zu holengopkg.in
? Wenn ja, ist das absolut beabsichtigtes Verhalten und Sie sollten sie einfach mit ihrem vollständigen Namen importieren. zBimport "gopkg.in/yaml.v1"
wie auch in den Dokumenten beschrieben .Edit: da Sie GOPATH gemeint, siehe fasmat ‚s Antwort (upvoted)
Wie unter " Wie kann ich mein Paket finden? " Erwähnt , müssen Sie ein Paket
xxx
in ein Verzeichnis stellenxxx
.Siehe die Go-Sprachspezifikation :
Die Kodex-Organisation erwähnt:
(Ein "Arbeitsbereich" ist ein Pfadeintrag in Ihrem
GOPATH
: Diese Variable kann auf mehrere Pfade verweisen, damit Ihr 'src, bin, pkg
' sein soll.)(Ursprüngliche Antwort)
Sie sollten auch
GOPATH
~ / go einstellen , nichtGOROOT
wie in " So schreiben Sie Go-Code " dargestellt.Das ist anders als
GOROOT
:quelle
TL; DR: Befolgen Sie die Go-Konventionen! (Lektion auf die harte Tour gelernt), suchen Sie nach alten Go-Versionen und entfernen Sie sie. Neueste installieren.
Für mich war die Lösung anders. Ich habe auf einem gemeinsam genutzten Linux-Server gearbeitet und nachdem ich meine
GOPATH
und andere Umgebungsvariablen mehrmals überprüft hatte, funktionierte es immer noch nicht. Ich habe mehrere Fehler festgestellt, darunter "Paket kann nicht gefunden werden" und "Nicht erkannter Importpfad". Nach dem Versuch, diese Lösung anhand der Anweisungen auf golang.org (einschließlich des Deinstallationsteils ) 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 (läuft
go version
dannwhich go
wieder ... DAHH), was mich zu dieser Frage gebracht und schließlich gelöst hat.quelle
Obwohl die akzeptierte Antwort immer noch richtig ist, wenn Verzeichnisse mit Paketnamen abgeglichen werden müssen, müssen Sie wirklich zur Verwendung von Go-Modulen migrieren, anstatt GOPATH zu verwenden. Neue Benutzer, die auf dieses Problem stoßen, sind möglicherweise verwirrt über die Erwähnungen der Verwendung von GOPATH (wie ich), die jetzt veraltet sind. Daher werde ich versuchen, dieses Problem zu beheben und Anleitungen zur Vermeidung dieses Problems bei der Verwendung von Go-Modulen bereitzustellen.
Wenn Sie bereits mit Go-Modulen vertraut sind und dieses Problem auftritt, fahren Sie mit meinen spezifischeren Abschnitten fort, in denen einige der Go-Konventionen behandelt werden, die leicht zu übersehen oder zu vergessen sind.
Dieses Handbuch enthält Informationen zu Go-Modulen: https://golang.org/doc/code.html
Projektorganisation mit Go-Modulen
Organisieren Sie nach der Migration zu Go-Modulen, wie in diesem Artikel erwähnt, den Projektcode wie folgt:
Sie können Ihr Modul folgendermaßen initialisieren:
Ihr Code muss sich nicht auf github.com befinden, damit er erstellt werden kann. Es wird jedoch empfohlen, Ihre Module so zu strukturieren, als würden sie irgendwann veröffentlicht.
Verstehen, was passiert, wenn versucht wird, ein Paket zu erhalten
Es gibt hier einen großartigen Artikel, der darüber spricht, was passiert, wenn Sie versuchen, ein Paket oder Modul zu erhalten: https://medium.com/rungo/anatomy-of-modules-in-go-c8274d215c16 Er beschreibt, wo das Paket gespeichert ist und wird helfen Ihnen zu verstehen, warum dieser Fehler möglicherweise auftritt, wenn Sie bereits Go-Module verwenden.
Stellen Sie sicher, dass die importierte Funktion exportiert wurde
Beachten Sie, dass Sie sicherstellen müssen, dass Sie Ihre Funktion exportiert haben, wenn Sie Probleme beim Zugriff auf eine Funktion aus einer anderen Datei haben. Wie im ersten Link beschrieben, muss eine Funktion mit einem Großbuchstaben beginnen, der exportiert und für den Import in andere Pakete verfügbar gemacht werden soll.
Namen von Verzeichnissen
Ein weiteres wichtiges Detail (wie in der akzeptierten Antwort erwähnt) ist, dass Namen von Verzeichnissen die Namen Ihrer Pakete definieren. (Ihre Paketnamen müssen mit ihren Verzeichnisnamen übereinstimmen.) Beispiele hierfür finden Sie hier: https://medium.com/rungo/everything-you-need-to-know-about-packages-in-go-b8bac62b74cc With Die Datei mit Ihrer
main
Methode (dh dem Einstiegspunkt Ihrer Anwendung) ist jedoch von dieser Anforderung ausgenommen.Als Beispiel hatte ich Probleme mit meinen Importen, wenn ich eine Struktur wie diese verwendete:
Ich konnte den Code nicht
utils
in meinmain
Paket importieren .Sobald ich jedoch
main.go
ein eigenes Unterverzeichnis erstellt habe, wie unten gezeigt, funktionierten meine Importe einwandfrei:In diesem Beispiel sieht meine go.mod-Datei folgendermaßen aus:
Wenn ich main.go nach dem Hinzufügen eines Verweises auf gespeichert habe
utils.MyFunction()
, hat meine IDE den Verweis auf mein Paket automatisch wie folgt abgerufen :(Ich verwende VS-Code mit der Golang-Erweiterung.)
Beachten Sie, dass der Importpfad das Unterverzeichnis zum Paket enthielt.
Umgang mit einem privaten Repo
Wenn der Code Teil eines privaten Repos ist, müssen Sie einen git-Befehl ausführen, um den Zugriff zu aktivieren. Andernfalls können andere Fehler auftreten. In diesem Artikel wird erwähnt, wie dies für private Github-, BitBucket- und GitLab-Repos durchgeführt wird: https://medium.com/cloud-native-the-gathering/go-modules-with-private-git- repositories-dfe795068db4 Dieses Problem wird auch hier behandelt: Wie kann man ein privates Repository richtig " abrufen "?
quelle
Haben Sie versucht, das absolute Verzeichnis von go zu Ihrem 'Pfad' hinzuzufügen ?
quelle