Aunque lo he GOPATH
configurado correctamente, todavía no puedo obtener "ir a compilar" o "ir a ejecutar" para encontrar mis propios paquetes. ¿Qué estoy haciendo mal?
$ echo $GOROOT
/usr/local/go
$ echo $GOPATH
/home/mitchell/go
$ cat ~/main.go
package main
import "foobar"
func main() { }
$ cat /home/mitchell/go/src/foobar.go
package foobar
$ go build main.go
main.go:3:8: import "foobar": cannot find package
$ go help gopath
Respuestas:
No funciona porque su
foobar.go
archivo fuente no está en un directorio llamadofoobar
.go build
ego install
intente hacer coincidir los directorios, no los archivos de origen.$GOPATH
en un directorio válido, p. Ej.export GOPATH="$HOME/go"
foobar.go
a$GOPATH/src/foobar/foobar.go
y la construcción debería funcionar bien.Pasos adicionales recomendados:
$GOPATH/bin
a tu$PATH
por:PATH="$GOPATH/bin:$PATH"
main.go
a una subcarpeta de$GOPATH/src
, p. Ej.$GOPATH/src/test
go install test
ahora debe crear un ejecutable en el$GOPATH/bin
que se pueda llamar escribiendotest
en su terminal.fuente
GOPATH=/usr/local/go-pkgs
, así que Go busca/usr/local/go-pkgs/src/<package-name>
la fuente, pero lago get
coloca/usr/local/go-pkgs/src/gopkg.in/<package-name>
. ¿Por qué debería tener que mover manualmente todos mis paquetes después de la instalación? Eso es una tontería.go get
normalmente pone paquetes en,$GOPATH/src/
así que si llamasgo get domain.com/path/to/package
terminará en$GOPATH/src/domain.com/path/to/package
. ¿Supongo que intentas buscar un paquetegopkg.in
? Si es así, ese es un comportamiento absolutamente intencionado y solo debe importarlos con su nombre completo; por ejemplo,import "gopkg.in/yaml.v1"
como también se describe en los documentos .Editar: ya que te referías a GOPATH, mira la respuesta de fasmat (upvoted)
Como se menciona en " ¿Cómo hago para encontrar mi paquete? ", Debe colocar un paquete
xxx
en un directorioxxx
.Ver las especificaciones del idioma Go :
La organización del Código menciona:
(un "espacio de trabajo" es una entrada de ruta en su
GOPATH
: esa variable puede hacer referencia a múltiples rutas para que su 'src, bin, pkg
' sea)(Respuesta original)
También debe establecer
GOPATH
~ / go, noGOROOT
, como se ilustra en " Cómo escribir el código Go ".Eso es diferente de
GOROOT
:fuente
TL; DR: ¡ Sigue las convenciones de Go! (Lección aprendida de la manera difícil), verifique las versiones anteriores de go y elimínelas . Instalar lo último.
Para mí la solución fue diferente. Trabajé en un servidor Linux compartido y después de verificar mi
GOPATH
y otras variables de entorno varias veces todavía no funcionó. Encontré varios errores que incluyen 'No se puede encontrar el paquete' y 'ruta de importación no reconocida'. Después de intentar reinstalar con esta solución siguiendo las instrucciones en golang.org (incluida la parte de desinstalación ), aún se encontraron problemas.Me tomó un tiempo para darse cuenta de que todavía hay una versión antigua que no ha sido desinstalado (que se ejecuta
go version
a continuación,which go
de nuevo ... dahh), que me llevó a esta pregunta y, finalmente resuelto.fuente
Aunque la respuesta aceptada sigue siendo correcta sobre la necesidad de hacer coincidir los directorios con los nombres de los paquetes, realmente necesita migrar para usar los módulos Go en lugar de usar GOPATH. Los nuevos usuarios que enfrentan este problema pueden estar confundidos acerca de las menciones de usar GOPATH (como era yo), que ahora están desactualizadas. Por lo tanto, intentaré aclarar este problema y proporcionar orientación relacionada con la prevención de este problema al usar los módulos Go.
Si ya está familiarizado con los módulos Go y está experimentando este problema, vaya a mis secciones más específicas a continuación que cubren algunas de las convenciones Go que son fáciles de pasar por alto u olvidar.
Esta guía enseña sobre los módulos Go: https://golang.org/doc/code.html
Organización del proyecto con módulos Go
Una vez que migre a los módulos Go, como se menciona en ese artículo, organice el código del proyecto como se describe:
Puede inicializar su módulo de esta manera:
Su código no necesita estar ubicado en github.com para que se pueda construir. Sin embargo, es una buena práctica estructurar sus módulos como si finalmente fueran publicados.
Comprender lo que sucede al intentar obtener un paquete
Aquí hay un gran artículo que habla sobre lo que sucede cuando intenta obtener un paquete o módulo: https://medium.com/rungo/anatomy-of-modules-in-go-c8274d215c16 Discute dónde se almacena el paquete y lo hará ayudarle a comprender por qué podría recibir este error si ya está utilizando los módulos Go.
Asegúrese de que la función importada se haya exportado
Tenga en cuenta que si tiene problemas para acceder a una función desde otro archivo, debe asegurarse de haber exportado su función. Como se describe en el primer enlace que proporcioné, una función debe comenzar con una letra mayúscula para exportar y poner a disposición para importar a otros paquetes.
Nombres de directorios
Otro detalle crítico (como se mencionó en la respuesta aceptada) es que los nombres de directorios son los que definen los nombres de sus paquetes. (Los nombres de sus paquetes deben coincidir con los nombres de sus directorios). Puede ver ejemplos de esto aquí: https://medium.com/rungo/everything-you-need-to-know-about-packages-in-go-b8bac62b74cc With Dicho esto, el archivo que contiene su
main
método (es decir, el punto de entrada de su solicitud) está exento de este requisito.Como ejemplo, tuve problemas con mis importaciones al usar una estructura como esta:
No pude importar el código en
utils
mimain
paquete.Sin embargo, una vez que lo puse
main.go
en su propio subdirectorio, como se muestra a continuación, mis importaciones funcionaron bien:En ese ejemplo, mi archivo go.mod se ve así:
Cuando guardé main.go después de agregar una referencia a
utils.MyFunction()
, mi IDE obtuvo automáticamente la referencia a mi paquete de esta manera:(Estoy usando VS Code con la extensión Golang).
Observe que la ruta de importación incluía el subdirectorio del paquete.
Tratar con un repositorio privado
Si el código es parte de un repositorio privado, debe ejecutar un comando git para habilitar el acceso. De lo contrario, puede encontrar otros errores Este artículo menciona cómo hacer eso para repositorios privados de Github, BitBucket y GitLab: https://medium.com/cloud-native-the-gathering/go-modules-with-private-git- repositorios-dfe795068db4 Este tema también se discute aquí: ¿Cuál es la forma correcta de "obtener" un repositorio privado?
fuente
¿Has intentado agregar el directorio absoluto de go to your 'path'?
fuente