Ir a la instalación falla con error: no hay ubicación de instalación para el directorio xxx fuera de GOPATH

152
~/src/go-statsd-client> echo $GOPATH
/Users/me/gopath
~/src/go-statsd-client> echo $GOROOT
/usr/local/Cellar/go/1.1.1\
~/src/go-statsd-client> go install
go install: no install location for directory /Users/me/src/go-statsd-client outside GOPATH

No importa en qué estructura esté el proyecto, esto siempre falla con el mismo mensaje. Ir a construir funciona perfectamente.

Aquí está mi go env

GOARCH="amd64"
GOBIN=""
GOCHAR="6"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/me/gopath"
GORACE=""
GOROOT="/usr/local/Cellar/go/1.1.1"
GOTOOLDIR="/usr/local/Cellar/go/1.1.1/pkg/tool/darwin_amd64"
CC="gcc"
GOGCCFLAGS="-g -O2 -fPIC -m64 -pthread -fno-common"
CGO_ENABLED="1"

Esto está en Mac OSX Mountain Lion y go se instaló con homebrew.

tgandrews
fuente

Respuestas:

116

Cuando no proporciona argumentos go install, el valor predeterminado es intentar instalar el paquete en el directorio actual. El mensaje de error le dice que no puede hacer eso, porque el directorio actual no es parte de su $GOPATH.

Tu también puedes:

  • Defina $GOPATHsu $ HOME ( export GOPATH=$HOME).
  • Mueva su fuente a la actual $GOPATH( mv ~/src/go-statsd-client /User/me/gopath).

Después de eso , ir al go-statsd-clientdirectorio y escribir go installfuncionará, y también lo hará go install go-statsd-clientdesde cualquier parte del sistema de archivos. Los binarios construidos entrarán $GOPATH/bin.

Como sugerencia no relacionada, es probable que desee espaciar el nombre de su paquete con un nombre de dominio, para evitar el choque de nombres (por ejemplo github.com/you/go-statsd-client, si es allí donde guarda su código fuente).

Gustavo Niemeyer
fuente
55
En mi caso, este error fue causado por no haber un $GOPATH/bindirectorio. Era necesario crear esta carpeta, no necesitaba configurar GOBINenv var.
xentek
44
@RobertReiz, mientras comparto su frustración, debo señalar que la mayoría de los otros idiomas los usan, pero tal vez no son tan visibles. Por ejemplo, Python (un lenguaje famoso por su simplicidad) tiene en PYTHONHOMElugar de GOROOTy en PYTHONPATHlugar de GOPATH. Incluso (GC) C tiene LIBRARY_PATH, C_INCLUDE_PATH, etc.
Hut8
1
Recibo este error después export GOPATH=$PWD(parado en la raíz de un árbol clon de Golang), su respuesta no puede explicar el error en este caso.
ulidtko 01 de
2
Para mí, ponerlo en $ GOPATH no fue suficiente. Tenía que estar en un directorio bajo $ GOPATH / src /
Thomas
9
Estoy seguro de que hay una muy buena razón para justificar la existencia de GOPATH, pero desde afuera mirando hacia adentro, esto parece completamente insensato. ¿Por qué tengo que mutar variables de entorno globales sólo para construir un paquete localmente 🤔
Alexander - Restablecer Mónica
191

Para cualquier usuario de OS X y para mí en el futuro, también debe configurarlo GOBINpara evitar este mensaje confuso en la instalación ygo get

mkdir bin 
export GOBIN=$GOPATH/bin
Benjamin Wootton
fuente
44
No debería necesitar configurarGOBIN . Si configurarlo $GOPATH/binmarca la diferencia, entonces hay algo más que está mal con tu configuración o estás haciendo algo que no deberías.
Dave C
29
@DaveC Yo también tengo el mismo problema en OS X. La configuración de GOBIN lo solucionó.
nJoshi
2
Muchas gracias, parece que algo con el paquete oficial de OS X está mal, de hecho requiere que configure GOBIN, aún válido para 10.11.4 (El Capitan)
Jonas D.
3
Esta es la solución correcta para Ubuntu 16.04 también, con el paquete binario de http://golang.org/dl/
suside
1
Esto funcionó perfectamente en maOS Sierra 10.12.3 ¡Gracias!
Greg Hilston
30

Está utilizando go install en un directorio fuera de la carpeta GOPATH. Establezca su variable GOBIN env o mueva la carpeta src dentro de GOPATH.

GOPATH/
     bin/
     src/
       go-statsd-client/

Más información: GO BUILD Código fuente , línea 296

Andrea Di Persio
fuente
Intenté la sugerencia anterior (exportar GOPATH = $ HOME), luego me mudé a mi directorio relevante (donde estoy escribiendo mi código) y escribí ir a instalar ... el mismo resultado ir a instalar: no hay ubicación de instalación para el directorio ...
stian
¿La línea 296 es solo una declaración de devolución?
Felix Rabe
1
Olvidé configurar mi env
GOBIN
Fui por esta solución.
Mihamina Rakotomandimby
19

Necesita configurar ambos GOPATHy GOBIN. Asegúrese de haber hecho lo siguiente (reemplácelo ~/gocon su preferido GOPATHy luego cámbielo GOBIN). Esto se prueba en Ubuntu 16.04 LTS.

export GOPATH=~/go 

mkdir ~/go/bin

export GOBIN=$GOPATH/bin

La respuesta seleccionada no resolvió el problema para mí.

Zhenhua
fuente
Los he definido en 16.04 y esto no funcionó para mí.
Catskul
5

Querrá tener 3 directorios dentro del directorio GOPATH elegido.

GOPATH
     /bin
     /src
       /someProgram
        program.go
       /someLibrary
        library.go
     /pkg

Luego, ejecutará go installdesde someProgram (que coloca un ejecutable en bin) o someLibrary (que coloca una biblioteca en pkg).

Earl Zedd
fuente
1
Esto funcionó para mí después de buscar durante 2 horas en internet.
vishalknishad
3

Tuve este problema en Windows.

Mi problema era que mi %GOPATH%variable de entorno estaba configurada en

C:\Users\john\src\goworkspace

en vez de

C:\Users\john\src\goworkspace\

Agregar la barra diagonal faltante al final lo arregló para mí.

eckza
fuente
1
Santa vaca, me acabas de salvar de un dolor de cabeza potencialmente de varias horas. Estoy en Ubuntu pero tuve el mismo problema. Fue extremadamente diligente acerca de los nombres de carpetas, la estructura de carpetas, el prefacio con src / github.com / xyabz / y todo, pero ir a instalar, me seguía dando errores.
anon58192932
3

Para lo que vale, aquí está mi .bash_profile, que funciona bien para mí en una Mac con Atom, después de instalar ir con Homebrew:

export GOROOT=`go env GOROOT`
export GOPATH=/Users/yy/Projects/go
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOBIN
JRun
fuente
2

En mi caso (OS X) fue porque lo configuré GOPATHen /home/username/go(según el libro) en lugar de/Users/username/go

catamphetamine
fuente
2

Estoy en Windows, y lo obtuve dando un comando go help gopatha cmd, y leí el texto en negrita en las instrucciones,

es decir, si el código que wnat instalar está en ..BaseDir...\SomeProject\src\basic\setel GOPATH no debe ser la misma ubicación que el código, debe ser justo Proyecto Base DIR: ..BaseDir...\SomeProject.

La variable de entorno GOPATH enumera los lugares para buscar el código Go. En Unix, el valor es una cadena separada por dos puntos. En Windows, el valor es una cadena separada por punto y coma. En el Plan 9, el valor es una lista.

Si la variable de entorno no está configurada, GOPATH se predetermina a un subdirectorio llamado "go" en el directorio de inicio del usuario ($ HOME / go en Unix,% USERPROFILE% \ go en Windows), a menos que ese directorio contenga una distribución Go. Ejecute "go env GOPATH" para ver el GOPATH actual.

Consulte https://golang.org/wiki/SettingGOPATH para establecer un GOPATH personalizado.

Cada directorio listado en GOPATH debe tener una estructura prescrita:

El directorio src contiene el código fuente. La ruta debajo de src determina la ruta de importación o el nombre del ejecutable.

El directorio pkg contiene objetos de paquete instalados. Como en el árbol Go, cada par de arquitectura y sistema operativo de destino tiene su propio subdirectorio de pkg (pkg / GOOS_GOARCH).

Si DIR es un directorio listado en GOPATH, un paquete con fuente en DIR / src / foo / bar se puede importar como "foo / bar" y tiene su forma compilada instalada en "DIR / pkg / GOOS_GOARCH / foo / bar.a ".

El directorio bin contiene comandos compilados. Cada comando recibe el nombre de su directorio de origen, pero solo el elemento final, no la ruta completa. Es decir, el comando con fuente en DIR / src / foo / quux se instala en DIR / bin / quux, no en DIR / bin / foo / quux. El prefijo "foo /" se elimina para que pueda agregar DIR / bin a su RUTA para obtener los comandos instalados. Si se establece la variable de entorno GOBIN, los comandos se instalan en el directorio que nombra en lugar de DIR / bin. GOBIN debe ser un camino absoluto.

Aquí hay un ejemplo de diseño de directorio:

GOPATH=/home/user/go

/home/user/go/
    src/
        foo/
            bar/               (go code in package bar)
                x.go
            quux/              (go code in package main)
                y.go
    bin/
        quux                   (installed command)
    pkg/
        linux_amd64/
            foo/
                bar.a          (installed package object)

..........

si GOPATH se configuró en DIR del proyecto base y aún tiene este problema, en Windows puede intentar configurar GOBIN como Base Project DIR\bino %GOPATH%\bin.

Yu Jang Jian
fuente
1

Cuidado al correr

export GOPATH=$HOME

Asuma que su código existe en lugares específicos relacionados con GOPATH. Entonces, en su lugar, puede usar docker para ejecutar cualquier comando go:

docker run -it -v $(pwd):/go/src/github.com/<organization name>/<repository name> golang

Y ahora puede usar cualquier comando de golang, por ejemplo:

go test github.com/<organization name>/<repository name> 
Omer Levi Hevroni
fuente
0

En Windows, mi ventana cmd ya estaba abierta cuando configuré la variable de entorno GOPATH. Primero tuve que cerrar el cmd y luego volver a abrirlo para que sea efectivo.

veta
fuente
0

El problema es que no está en el directorio del paquete que tiene el archivo go con la función go main y go install no puede encontrar el comando (archivo go con la función go main) que desea instalar.

$ cd /path/to/file-with-main-function.go

y luego ejecuta:

$ go install 
Margach Chris
fuente
-1

En OSX 10.14 Mojave, goestá normalmente instalado en /usr/local/go.

Por lo tanto, configure estos ENV y debería estar listo para comenzar.

export GOPATH=/usr/local/go && export GOBIN=/usr/local/go/bin

Además, agréguelos a su bash_profileo zsh_profilesi funciona.

echo "export GOPATH=/usr/local/go && export GOBIN=/usr/local/go/bin" >> ~/.bash_profile && source ~/.bash_profile

Un puntero nulo
fuente