Soy nuevo y estoy trabajando en un código de ejemplo que quiero localizar.
En la main.go
declaración de importación original era:
import (
"log"
"net/http"
"github.com/foo/bar/myapp/common"
"github.com/foo/bar/myapp/routers"
)
Ahora tengo common
y routers
el paquete de/home/me/go/src/myapp
Así que convertí la declaración de importación a:
import (
"log"
"net/http"
"./common"
"./routers"
)
Pero cuando ejecuto go install myapp
me sale estos errores:
can't load package: /home/me/go/src/myapp/main.go:7:3: local import "./common" in non-local package
Además, cuando uso common
y en routers
lugar de ./common
y ./routers
en la declaración de importación, obtengo:
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)
¿Cómo puedo arreglar esto?
Respuestas:
Bueno, descubrí el problema. Básicamente, la ruta de inicio de Go para la importación es
$HOME/go/src
Así que solo necesitaba agregar
myapp
delante de los nombres del paquete, es decir, la importación debería ser:import ( "log" "net/http" "myapp/common" "myapp/routers" )
fuente
myapp
es una mala idea, por ejemplo, si cambia el nombre del proyecto, toda la importacióngo mod init <module_name>
y luego soloimport "<module_name>/<pkg_name>"
.Si está utilizando Go 1.5 anterior, puede intentar utilizar la función de proveedor . Le permite poner su paquete local en la carpeta del proveedor e importarlo con una ruta más corta. En su caso, puede poner su carpeta común y de enrutadores dentro de la carpeta del proveedor para que sea como
myapp/ --vendor/ ----common/ ----routers/ ------middleware/ --main.go
e importarlo así
import ( "common" "routers" "routers/middleware" )
Esto funcionará porque Go intentará buscar su paquete comenzando en el directorio de proveedores de su proyecto (si tiene al menos un archivo .go) en lugar de $ GOPATH / src.
FYI: Puede hacer más con el proveedor, porque esta característica le permite poner "todo el código de su dependencia" para un paquete dentro del directorio de su propio proyecto para que siempre pueda obtener las mismas versiones de dependencias para todas las compilaciones. Es como npm o pip en python, pero necesita copiar manualmente sus dependencias a su proyecto, o si quiere hacerlo más fácil, intente buscar gobernador por Daniel Theophanes
Para obtener más información sobre esta función, intente buscar aquí
Comprensión y uso de la carpeta de proveedores por Daniel Theophanes
Comprendiendo la gestión de la dependencia de Go por Lucas Fernandes da Costa
Espero que usted o alguien más lo encuentre útil.
fuente
Caminos de importación son en relación con sus
$GOPATH
y$GOROOT
variables de entorno. Por ejemplo, con lo siguiente$GOPATH
:GOPATH=/home/me/go
Los paquetes ubicados en
/home/me/go/src/lib/common
y/home/me/go/src/lib/routers
se importan respectivamente como:import ( "lib/common" "lib/routers" )
fuente
go install
paquetes que usan importaciones relativas.$GOPATH/src
.El paquete local es un problema molesto en marcha.
Para algunos proyectos de nuestra empresa, decidimos no utilizar subpaquetes en absoluto.
$ glide install
$ go get
$ go install
Todo el trabajo.
Para algunos proyectos usamos subpaquetes e importamos paquetes locales con la ruta completa:
import "xxxx.gitlab.xx/xxgroup/xxproject/xxsubpackage
Pero si bifurcamos este proyecto, los subpaquetes aún hacen referencia al original.
fuente