Ich bin neu darin, an einem Beispielcode zu arbeiten, den ich lokalisieren möchte.
In der ursprünglichen main.go
Importanweisung war es:
import (
"log"
"net/http"
"github.com/foo/bar/myapp/common"
"github.com/foo/bar/myapp/routers"
)
Jetzt habe ich common
und routers
packe ein/home/me/go/src/myapp
Also habe ich die import-Anweisung konvertiert in:
import (
"log"
"net/http"
"./common"
"./routers"
)
Aber wenn ich renne, go install myapp
bekomme ich folgende Fehler:
can't load package: /home/me/go/src/myapp/main.go:7:3: local import "./common" in non-local package
Wenn ich common
und routers
anstelle von ./common
und ./routers
in der import-Anweisung verwende, erhalte ich außerdem Folgendes:
myapp/main.go:7:3: cannot find package "common" in any of:
/usr/local/go/src/common (from $GOROOT)
/home/me/go/src/common (from $GOPATH)
myapp/main.go:8:2: cannot find package "routers" in any of:
/usr/local/go/src/routers (from $GOROOT)
/home/me/go/src/routers (from $GOPATH)
Wie kann ich das beheben?
Antworten:
Nun, ich habe das Problem herausgefunden. Grundsätzlich ist Startpfad für den Import
$HOME/go/src
Also musste ich nur
myapp
vor den Paketnamen hinzufügen , das heißt, der Import sollte sein:import ( "log" "net/http" "myapp/common" "myapp/routers" )
quelle
myapp
ist eine schlechte Idee. Wenn Sie beispielsweise den Projektnamen ändern,go mod init <module_name>
und dann einfachimport "<module_name>/<pkg_name>"
.Wenn Sie oben Go 1.5 verwenden, können Sie versuchen, die Vendoring- Funktion zu verwenden. Sie können Ihr lokales Paket im Ordner des Anbieters ablegen und mit einem kürzeren Pfad importieren. In Ihrem Fall können Sie Ihren Common- und Router- Ordner in den Vendor- Ordner legen, so wie es wäre
myapp/ --vendor/ ----common/ ----routers/ ------middleware/ --main.go
und importiere es so
import ( "common" "routers" "routers/middleware" )
Dies funktioniert, da Go versucht, Ihr Paket ab dem Herstellerverzeichnis Ihres Projekts (sofern mindestens eine .go-Datei vorhanden ist) anstelle von $ GOPATH / src zu suchen.
Zu Ihrer Information: Mit dem Anbieter können Sie mehr tun, da Sie mit dieser Funktion "den gesamten Code Ihrer Abhängigkeit" für ein Paket in das Verzeichnis Ihres eigenen Projekts einfügen können, sodass für alle Builds immer die gleichen Abhängigkeitsversionen abgerufen werden können. Es ist wie npm oder pip in Python, aber Sie müssen Ihre Abhängigkeiten manuell in Ihr Projekt kopieren, oder wenn Sie es einfach machen möchten, versuchen Sie, einen Gouverneur von Daniel Theophanes zu suchen
Weitere Informationen zu dieser Funktion finden Sie hier
Vendor Folder verstehen und verwenden von Daniel Theophanes
Grundlegendes zum Go-Abhängigkeitsmanagement von Lucas Fernandes da Costa
Ich hoffe, Sie oder jemand anderes finden es hilfreich
quelle
Importpfade sind relativ zu Ihren
$GOPATH
und$GOROOT
Umgebungsvariablen. Zum Beispiel mit folgendem$GOPATH
:GOPATH=/home/me/go
Pakete in
/home/me/go/src/lib/common
und/home/me/go/src/lib/routers
werden jeweils importiert als:import ( "lib/common" "lib/routers" )
quelle
go install
Pakete verwenden, die relative Importe verwenden.$GOPATH/src
.Lokales Paket ist ein nerviges Problem in go.
Für einige Projekte in unserem Unternehmen entscheiden wir uns, überhaupt keine Unterpakete zu verwenden.
$ glide install
$ go get
$ go install
Alle Arbeit.
Für einige Projekte verwenden wir Unterpakete und importieren lokale Pakete mit vollständigem Pfad:
import "xxxx.gitlab.xx/xxgroup/xxproject/xxsubpackage
Wenn wir dieses Projekt jedoch aufteilen, verweisen die Unterpakete immer noch auf das Original.
quelle