GOBIN no configurado: no se puede ejecutar ir a instalar

86

Estoy intentando instalar mi paquete personalizado para mi archivo main.go. Sin embargo, cuando corrí

go install custom.go

Tengo este error

go install: no install location for .go files listed on command line (GOBIN not set)

¿Cómo configuro GOBIN?

usuario3918985
fuente
16
Por cierto: esta es una forma completamente incorrecta de instalar un paquete. Esto nunca funcionará. go installinstala paquetes, no archivos individuales. Lea todo en golang.org/cmd/go y vea cómo configurar sus archivos.
Volker
¡Gracias por el aviso!
user3918985
2
Creo que estás buscando ir a construir.
bunnybare
2
No estoy seguro de estar de acuerdo en que esté completamente mal. Cuando se establece GOBIN, hay dos comportamientos distintos: Cuando se usa go build <gofile.go>, el ejecutable se crea en la misma carpeta. Al usar go install <gofile.go>, el ejecutable se crea en GOBIN.
Erez A. Korn
2
FWIW: los documentos predeterminados para comenzar recomiendan que haga exactamente esto. golang.org/doc/install
Mike Buckbee

Respuestas:

46

Actualización 2020: desde Go 1.11 y la introducción de los módulos Go , GOPATHya no es necesario por proyecto, y está predeterminado~/go para las herramientas / proyectos globales que necesitaría go get.

Ir 1,16 (Q1 2020) en caso de incumplimiento GOBINa GOPATH[0]/bin .

Pero por ahora, para cualquier proyecto que utilice módulos, ya no tendrá un mensaje de error como " go install: no install location ...".


Respuesta original 2014:

Comprueba tu GOPATHvariable.
Asegurarse:

  • tus fuentes están bajo GOPATH/src
  • tienes una bincarpeta dentro de tu carpeta GOPATH.

Consulte la variable de entorno GOPATH (donde 'DIR' es una GOPATHcarpeta):

El bindirectorio 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/quuxestá instalado DIR/bin/quux, no DIR/bin/foo/quux. El foo/prefijo " " se elimina para que pueda agregarlo DIR/bina su PATHpara obtener los comandos instalados.

Si se establece la GOBINvariable de entorno, los comandos se instalan en el directorio que nombra en lugar de DIR/bin. GOBINdebe ser un camino absoluto.


Por ejemplo, este hilo ilustra lo que sucede en el caso de que se realice una compilación de go fuera de GOPATH/src:

Parece que GOPATHestá configurado en ~/gopero ejecutó el go installcomando en~/dev/go

Ver Ir a construir

La ruta de Go es una lista de árboles de directorios que contienen el código fuente de Go. Se consulta para resolver las importaciones que no se encuentran en el árbol Go estándar.

Si lo ha hecho go build, también puede probar un go install(no custom.go): desea instalar el paquete, no un solo archivo.

VonC
fuente
¿quieres decir esto? Hice eco de $ PATH y obtuve esto: / Users / apple / bin: / usr / bin: / bin: / usr / sbin: / sbin: / usr / local / bin: / usr / local / git / bin: / usr / local / go / bin: / usr / local / mysql / bin
user3918985
76

Establecí el camino de GOBIN y eso funcionó para mí.

export GOBIN=[WorkspacePath]/bin
Pratik Goenka
fuente
2
sí, esta es la respuesta correcta. simplemente cree / bin en ese GOPATH
swdev
7
Después de la ruta de exportación, aparece el error cannot install, GOBIN must be an absolute path:(
lee el
@lee ¿Usó ..o ~en la ruta que especificó? Recibí ese error y simplemente cambié a una ruta absoluta como /home/ben/bin/o incluso $HOME/bin/. Mi comando completo fue (en concha, vaya a v1.11) env GOBIN=$HOME/bin/ go install testfile.go.
Benny Jobigan
40

Como principiante, encontré este error cuando estaba probando varios comandos go (compilar, ejecutar e instalar). En resumen, no puede instalar un filename.go . Solo puede instalar un paquete.

Esto fue confuso, porque había aprendido que:

nate:~/work/src/dir $ go run hello/hello.go
hello, world.

Funciona genial. Pero no pude entender por qué la instalación no funcionaría:

nate:~/work/src/dir $ go install hello/hello.go 
go install: no install location for .go files listed on command line (GOBIN not set)
nate:~/work/src/dir $ go install hello
can't load package: package hello: cannot find package "hello" in any of:
    /opt/go/src/hello (from $GOROOT)
    /home/ubuntu/work/src/hello (from $GOPATH)

No importa en qué directorio estaba:

nate:~/work/src/dir $ cd hello
nate:~/work/src/dir/hello $ go install hello.go 
go install: no install location for .go files listed on command line (GOBIN not set)
nate:~/work/src/dir/hello $ go install hello
can't load package: package hello: cannot find package "hello" in any of:
    /opt/go/src/hello (from $GOROOT)
    /home/ubuntu/work/src/hello (from $GOPATH)

Esta confusión se debe a que go run solo funciona con archivos fuente de Go (nombres de archivo que terminan en .go) y go install solo acepta paquetes. Los paquetes se nombran por sus rutas de importación o la ruta del sistema de archivos. Así:

nate:~/work/src/dir $ go install dir/hello
nate:~/work/src/dir $ go install ./hello/
nate:~/work/src/dir/hello $ go install .

todo funciona muy bien. El primero se refiere al paquete por ruta de importación, (dado que $ GOPATH = "/ home / nate / work", las herramientas go buscan el código fuente en / home / nate / work / src), los demás se interpretan como sistema de archivos caminos debido a los períodos principales.

Consulte también los documentos de GOPATH .

Nate Green
fuente
1
esta es la verdadera solución en mi opinión. go installfunciona en directorios y si especifica un archivo go en particular, puede causar este problema en particular.
senseiwu
13

En realidad, hay 2 tipos diferentes de comportamiento.

go install <package>

esto está documentado en Compilar e instalar paquetes y dependencias . No necesita GOBIN si configura GOPATH correctamente.

go install <gofile>

esto no está documentado y necesita la variable env GOBIN en este modo.

PickBoy
fuente
1
go install <gofile>está documentado, en el go help packagesque se go install --helprefiere. El problema es que go install(en 1.9.2 y anteriores) tiene un comportamiento inconsistente, en un caso requiere y en otro no requiere que GOBIN se establezca explícitamente.
Stevo Slavić
7

Como señalaron las respuestas anteriores, si su env GOPATH está configurado correctamente en su espacio de trabajo, no necesita configurar la variable env GOBIN.

Compruebe sus variables de entorno go ejecutando $ go env | grep -i "^ GO" y busque GOROOT y GOPATH para comprobar si GOROOT está apuntando a su instalación de fuente GO y GOPATH apuntando a su espacio de trabajo.

Si todo está correcto, navegue hasta el subdirectorio donde reside yourpkg.go, luego ejecute $ go build (sin nombre de archivo) primero y $ go install (nuevamente sin su nombre de archivo) en segundo lugar, si no ve ningún mensaje de error en la pantalla su el paquete está listo en su espacio de trabajo / pkg / youros /../ yourpackage.a

user42754
fuente
7

En Windows con cygwin, parece una buena idea configurar GOBIN en $ GOPATH / bin.

y recuerde escapar correctamente del separador de nombre de archivo de Windows:

$ echo $GOROOT
C:\Go\

carl@rainier ~/gocode/src/github.com/user/hello
$ echo $GOPATH
C:\cygwin64\home\carl\gocode

carl@rainier ~/gocode/src/github.com/user/hello
$ echo $GOBIN
C:\cygwin64\home\carl\gocode\bin
Carl Encuadernación
fuente
5

Para el *nixsistema, mire dónde goestá instalado, ejecutando el siguiente comando:

$ which go

qué salida digamos:

/usr/local/go/bin/go

luego agregue las siguientes entradas en ~/.bash_profileo en ~/.zshrc:

export GOROOT=/usr/local/go
export GOPATH=$GOROOT/src //your-go-workspace
export GOBIN=$GOROOT/bin //where go-generate-executable-binaries

PATH=$PATH:$GOPATH:$GOBIN

export PATH

PD: no te olvides de la fuente ~/.bash_profileo ~/.zshrc, de la siguiente manera:

$ source ~/.bash_profile
Arpit Aggarwal
fuente
4
¿Realmente quieres incluir ejecutables de desarrollo /usr/local/go/bin?
Dolph
1

Con respecto a la configuración de la GOBINversión de la variable, no la requiere y solo se basa en GOPATH:

  1. GOBINes necesario si no tenemos un paquete, es decir, el archivo está directamente en el GOPATHdirectorio. Esto es probable cuando estamos probando las funciones de Go como estudiantes

  2. Para proyectos típicos de Go, los archivos se encuentran en los directorios del paquete. Para estos, GOPATHes suficiente.

  3. En otras palabras, las dos soluciones siguientes funcionarían: a. Establecer GOBINexplícitamente como $ GOPATH / bin [solo con fines de aprendizaje, se puede evitar] b. Cree un subdirectorio que sería el nombre de su paquete y mueva los archivos .go a él

  4. Supongo que las utilidades Go deberían eliminar el error anterior y manejar mejor el escenario, según si el argumento es un directorio o un archivo fuente

pr-pal
fuente
1

Para usuarios de WINDOWS

Abra un símbolo del sistema ( Win+ rluego escriba cmd) o una ventana de PowerShell ( Win+ xluego escriba i).

Configuración de GOPATH

NOTA: GOPATH no debe ser la misma ruta que su instalación de Go.

go env -w GOPATH=c:\your-go-work

Más detalles en el enlace a continuación https://github.com/golang/go/wiki/SettingGOPATH#windows

Configuración de GOBIN

go env -w GOBIN=C:\somewhere\else\bin

Recomiendo comprobar el ejemplo de código proporcionado por golang. Me ayudó un montón. https://golang.org/doc/code.html#Command

Enrique
fuente
1

En Windows:

go env -w GOBIN=C:\Users\yourname\go\bin

Confirme con el go envcomando que GOBIN está configurado, luego el go installcomando guarda correctamente el ejecutable en el directorio bin.

Frankie Wong
fuente
1

Yo también tuve el mismo problema (no es necesario configurar GOBIN por separado), asegúrese de tener lo siguiente

  1. GOPATH está configurado (esto también establece automáticamente GOBIN como $ GOPATH / bin)
  2. GOPATH tiene los siguientes directorios bin, pkg, src
  3. custom.go se coloca en src / <your_module>
  4. entonces corre go install <your_module>
  5. puede encontrar la verificación del binario compilado (<your_module>) en la carpeta bin
Manjunath Bhadrannavar
fuente
0

No necesita $ GOBIN si ha configurado un $ GOPATH correctamente. Si es así, simplemente vuelva a verificar si su proyecto reside en la carpeta $ GOPATH / src .

theVoogie
fuente
0

De https://golang.org/cmd/go/#hdr-Environment_variables :

GOBIN El directorio donde 'go install' instalará un comando.

y https://golang.org/cmd/go/#hdr-GOPATH_environment_variable :

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.

y https://golang.org/cmd/go/#hdr-Modules__module_versions__and_more

En el modo compatible con módulos, GOPATH ya no define el significado de las importaciones durante una compilación, pero aún almacena las dependencias descargadas (en GOPATH / pkg / mod) y los comandos instalados (en GOPATH / bin, a menos que GOBIN esté configurado).

Por lo tanto, parece que básicamente puede usar GOBIN para anular temporal o permanentemente la ubicación de instalación binaria predeterminada (es decir $GOPATH/bin). Tuve éxito al instalar un "script" de 1 archivo usando env GOBIN=$HOME/bin/ go install testfile.go. Esto se hizo usando go v1.11.

Benny Jobigan
fuente
0

Tratar

export GOROOT=""

export PATH=$PATH:$GOROOT/bin

Thiên Trần
fuente