¿Cómo importar paquetes locales en go?

90

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?

Karlom
fuente
5
Todas las importaciones son "locales" independientemente de la ruta de importación. Consulte "Cómo escribir código Go" para obtener una explicación detallada.
JimB
21
@JimB dejando de lado los debates filosóficos, lo que me preocupa es cómo solucionar el problema mencionado anteriormente.
Karlom
3
No estoy tratando de hacer una declaración filosófica, estoy diciendo literalmente que todas las importaciones ocurren en su sistema de archivos local; nunca hay ninguna diferencia si se originan en un repositorio remoto o no. No intente utilizar rutas relativas (a veces funcionan, pero no se recomiendan) y consulte el documento "Cómo escribir código Go", específicamente la sección sobre "Organización del código" .
JimB

Respuestas:

63

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 myappdelante de los nombres del paquete, es decir, la importación debería ser:

import (
    "log"
    "net/http"
    "myapp/common"
    "myapp/routers"
)
Karlom
fuente
3
usar el nombre del proyecto como myappes una mala idea, por ejemplo, si cambia el nombre del proyecto, toda la importación
fallará
7
Cual es la alternativa? Go no recomienda que utilice importaciones relativas.
Sam Holmes
11
Por supuesto, todas las importaciones fallarán si cambia el nombre del proyecto. El nombre del proyecto rara vez cambia.
Damien Roche
21
Bueno, a partir de go1.11 puede utilizar el nuevo sistema de módulos. go mod init <module_name>y luego solo import "<module_name>/<pkg_name>".
chillido
¿Cómo podemos importar github.com/dgrijalva/jwt-go en nuestro archivo .go? Mi carpeta jwt-go está dentro de src / github.com / dgrijalva
Manik Thakur
30

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.

arimaulana
fuente
18

Caminos de importación son en relación con sus $GOPATHy $GOROOTvariables de entorno. Por ejemplo, con lo siguiente $GOPATH:

GOPATH=/home/me/go

Los paquetes ubicados en /home/me/go/src/lib/commony /home/me/go/src/lib/routersse importan respectivamente como:

import (
    "lib/common"
    "lib/routers"
)
wlredeye
fuente
Sí, el primer ejemplo fue mi error.
wlredeye
¿Qué quiere decir con ruta relativa no admitida por las herramientas?
wlredeye
2
No puede go installpaquetes que usan importaciones relativas.
JimB
Creo que es un malentendido aquí. Me refiero en relación con GOPATH. No solo relativo como "../../mypackage"
wlredeye
Eso fue en referencia a la parte que solucionó acerca de la importación relativa al directorio actual. Sí, todas las importaciones de usuarios son relativas a $GOPATH/src.
JimB
5

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.

tangxinfa
fuente