¿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?


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"
)

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.


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"
)

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.