Soy nuevo y estoy trabajando en un código de ejemplo que quiero localizar.
En la main.godeclaración de importación original era:
import (
"log"
"net/http"
"github.com/foo/bar/myapp/common"
"github.com/foo/bar/myapp/routers"
)
Ahora tengo commony routersel 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 myappme 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 commony en routerslugar de ./commony ./routersen 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/srcAsí que solo necesitaba agregar
myappdelante de los nombres del paquete, es decir, la importación debería ser:import ( "log" "net/http" "myapp/common" "myapp/routers" )fuente
myappes 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.goe 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
$GOPATHy$GOROOTvariables de entorno. Por ejemplo, con lo siguiente$GOPATH:GOPATH=/home/me/goLos paquetes ubicados en
/home/me/go/src/lib/commony/home/me/go/src/lib/routersse importan respectivamente como:import ( "lib/common" "lib/routers" )fuente
go installpaquetes 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 installTodo el trabajo.
Para algunos proyectos usamos subpaquetes e importamos paquetes locales con la ruta completa:
import "xxxx.gitlab.xx/xxgroup/xxproject/xxsubpackagePero si bifurcamos este proyecto, los subpaquetes aún hacen referencia al original.
fuente