A instalação Go falha com erro: nenhum local de instalação para o diretório xxx fora 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

Independentemente da estrutura do projeto, sempre falha com a mesma mensagem. Ir construir funciona perfeitamente.

Aqui está o meu 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"

Este é o Mac OSX Mountain Lion e foi instalado com o homebrew.

tgandrews
fonte

Respostas:

116

Quando você não fornece argumentos go install, o padrão é tentar instalar o pacote no diretório atual. A mensagem de erro está informando que não é possível fazer isso, porque o diretório atual não faz parte do seu $GOPATH.

Você também pode:

  • Defina $GOPATHpara seu $ HOME ( export GOPATH=$HOME).
  • Mova sua fonte para dentro do atual $GOPATH( mv ~/src/go-statsd-client /User/me/gopath).

Depois disso, entrar no go-statsd-clientdiretório e digitar go installfuncionará, assim como digitar go install go-statsd-clientem qualquer lugar do sistema de arquivos. Os binários construídos entrarão $GOPATH/bin.

Como sugestão não relacionada, você provavelmente deseja colocar um espaço no nome do seu pacote com um nome de domínio, para evitar conflitos de nomes (por exemplo github.com/you/go-statsd-client, se é onde você guarda o seu código-fonte).

Gustavo Niemeyer
fonte
5
No meu caso, esse erro foi causado por não haver um $GOPATH/bindiretório. Criar essa pasta era o necessário - eu não precisava definir GOBINenv var.
xentek
4
@RobertReiz enquanto compartilho sua frustração, devo salientar que a maioria dos outros idiomas os usa de fato, mas talvez eles não sejam tão visíveis. Por exemplo, Python (uma linguagem famosa por sua simplicidade) tem PYTHONHOME, em vez de GOROOTe PYTHONPATHem vez de GOPATH. Mesmo (CG) C tem LIBRARY_PATH, C_INCLUDE_PATHetc.
Hut8
1
Recebo esse erro depois export GOPATH=$PWD(de pé na raiz de uma árvore de clones de Golang), sua resposta não pode explicar o erro nesse caso.
ulidtko
2
Para mim, colocá-lo em $ GOPATH não foi suficiente. Ele precisava estar em um diretório em $ GOPATH / src /
Thomas
9
Tenho certeza de que há boas razões para justificar a existência de GOPATH, mas, do lado de fora, isso parece completamente irracional. Por que eu tenho de sofrer mutações variáveis de ambiente globais apenas para construir um pacote localmente 🤔
Alexander - Reintegrar Monica
191

Para qualquer usuário do OS X e para o futuro, você também precisa definir GOBINpara evitar essa mensagem confusa na instalação ego get

mkdir bin 
export GOBIN=$GOPATH/bin
Benjamin Wootton
fonte
4
Você não precisa definirGOBIN . Se configurá-lo para $GOPATH/binfazer a diferença, algo mais está errado com sua configuração ou você está fazendo algo que não deveria.
Dave C
29
@DaveC Eu também tenho o mesmo problema no OS X. A configuração do GOBIN o corrigiu.
NJoshi
2
Muito obrigado, parece que alguma coisa com o pacote oficial OS X é errado, na verdade exigindo-lhe para definir GOBIN, ainda válido para 10.11.4 (El Capitan)
Jonas D.
3
Esta é a correção correta para o Ubuntu 16.04, também, com o pacote binário de http://golang.org/dl/
suside
1
Isso funcionou perfeitamente no maOS Sierra 10.12.3 Obrigado!
Greg Hilston
30

Você está usando go install em um diretório fora da pasta GOPATH. Defina sua variável env do GOBIN ou mova a pasta src para dentro do GOPATH.

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

Mais informações: GO BUILD Código fonte , linha 296

Andrea Di Persio
fonte
Eu tentei a sugestão acima (export GOPATH = $ HOME), depois mudei para o meu diretório relevante (onde estou escrevendo meu código) e digitei ir instalar ... mesmo resultado ir instalar: nenhum local de instalação para o diretório ....
stian
A linha 296 é apenas uma declaração de retorno?
Felix Rabe
1
Eu esqueci de definir o meu ambiente GOBIN
cevaris
Eu fui para esta solução.
Mihamina Rakotomandimby
19

Você precisa configurar ambos GOPATHe GOBIN. Verifique se você fez o seguinte (substitua ~/gopelo seu preferido GOPATHe depois altere GOBIN). Isso é testado em Ubuntu 16.04 LTS.

export GOPATH=~/go 

mkdir ~/go/bin

export GOBIN=$GOPATH/bin

A resposta selecionada não resolveu o problema para mim.

Zhenhua
fonte
Eu defini ambos no 16.04 e isso não funcionou para mim.
Catskul
5

Você deseja ter 3 diretórios dentro do diretório GOPATH escolhido.

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

Em seguida, você executará a go installpartir do someProgram (que coloca um executável em bin) ou someLibrary (que coloca uma biblioteca no pkg).

Earl Zedd
fonte
1
Isso funcionou para mim depois de pesquisar por 2 horas na internet.
vishalknishad
3

Eu tive esse problema no Windows.

Meu problema era que minha %GOPATH%variável de ambiente estava definida como

C:\Users\john\src\goworkspace

ao invés de

C:\Users\john\src\goworkspace\

Adicionar a barra final no final foi corrigida para mim.

eckza
fonte
1
vaca sagrada, você acabou de me salvar de uma dor de cabeça potencialmente de várias horas. Estou no Ubuntu, mas tive o mesmo problema. Foi extremamente diligente sobre nomes de pastas, estrutura de pastas, prefácio de src / github.com / xyabz / e tudo mais, exceto instalação, continuaram me causando erros.
precisa saber é o seguinte
3

Pelo que vale, aqui está o meu .bash_profile, que funciona bem para mim em um mac com Atom, depois de instalar o ir com o Homebrew:

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

No meu caso (OS X), foi porque eu configurei GOPATHpara /home/username/go(conforme o livro) em vez de/Users/username/go

catanfetamina
fonte
2

Estou no Windows e consegui-o, dando o comando go help gopathpara cmd e li o texto em negrito na instrução,

isto é, se o código que você wnat para instalar está em ..BaseDir...\SomeProject\src\basic\set, a GOPATH não deve ser o mesmo local como o código, deve ser apenas base do projeto DIR: ..BaseDir...\SomeProject.

A variável de ambiente GOPATH lista lugares para procurar o código Go. No Unix, o valor é uma sequência separada por dois pontos. No Windows, o valor é uma sequência separada por ponto e vírgula. No plano 9, o valor é uma lista.

Se a variável de ambiente não estiver definida, o GOPATH assumirá como padrão o subdiretório denominado "go" no diretório inicial do usuário ($ HOME / vá no Unix,% USERPROFILE% \ go no Windows), a menos que esse diretório possua uma distribuição Go. Execute "go env GOPATH" para ver o GOPATH atual.

Consulte https://golang.org/wiki/SettingGOPATH para definir um GOPATH personalizado.

Cada diretório listado em GOPATH deve ter uma estrutura prescrita:

O diretório src contém o código fonte. O caminho abaixo de src determina o caminho de importação ou o nome do executável.

O diretório pkg contém objetos de pacote instalados. Como na árvore Go, cada par de sistema operacional e arquitetura de destino possui seu próprio subdiretório pkg (pkg / GOOS_GOARCH).

Se DIR for um diretório listado no GOPATH, um pacote com origem em DIR / src / foo / bar poderá ser importado como "foo / bar" e terá seu formato compilado instalado em "DIR / pkg / GOOS_GOARCH / foo / bar.a "

O diretório bin contém comandos compilados. Cada comando é nomeado para seu diretório de origem, mas apenas o elemento final, não o caminho inteiro. Ou seja, o comando com origem no DIR / src / foo / quux é instalado no DIR / bin / quux, não no DIR / bin / foo / quux. O prefixo "foo /" é removido para que você possa adicionar DIR / bin ao seu PATH para obter os comandos instalados. Se a variável de ambiente GOBIN estiver configurada, os comandos serão instalados no diretório que ele nomeia, em vez de DIR / bin. GOBIN deve ser um caminho absoluto.

Aqui está um exemplo de layout de diretório:

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)

..........

se GOPATH tiver sido definido como Projeto Base DIR e ainda tiver esse problema, no Windows você pode tentar definir GOBIN como Base Project DIR\binou %GOPATH%\bin.

yu yang Jian
fonte
1

Cuidado ao executar

export GOPATH=$HOME

Vá supor que seu código exista em locais específicos relacionados a GOPATH. Portanto, você pode usar o docker para executar qualquer comando go:

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

E agora você pode usar qualquer comando golang, por exemplo:

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

No Windows, minha janela do cmd já estava aberta quando eu defini a variável de ambiente GOPATH. Primeiro tive que fechar o cmd e reabri-lo para que ele se tornasse eficaz.

filão
fonte
0

O problema é que você não está no diretório do pacote que possui o arquivo go com a função go main e a instalação go não pode encontrar o comando (arquivo go com a função go main) que deseja instalar.

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

e então execute:

$ go install 
Margach Chris
fonte
-1

No OSX Mojave 10.14, normalmentego é instalado em ./usr/local/go

Portanto, configure esses ENVs e você deve estar pronto.

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

Além disso, adicione-os ao seu bash_profileou zsh_profilese funcionar.

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

Um ponteiro nulo
fonte