GOBIN não definido: não é possível executar vá instalar

86

Estou tentando instalar meu pacote personalizado para meu arquivo main.go. No entanto, quando eu corri

go install custom.go

Eu entendi esse erro

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

Como eu defino GOBIN?

user3918985
fonte
16
BTW: esta é uma maneira completamente errada de instalar um pacote. Isso nunca vai funcionar. go installinstala pacotes, não arquivos individuais. Leia todo golang.org/cmd/go e veja como configurar seus arquivos.
Volker
obrigado pelo aviso!
user3918985
2
Eu acho que você está procurando construir.
bunnybare
2
Não tenho certeza se concordo que esteja completamente errado. Quando GOBIN é definido, há dois comportamentos distintos: Ao usar go build <gofile.go>, o executável é criado na mesma pasta. Ao usar go install <gofile.go>, o executável é criado em GOBIN.
Erez A. Korn
2
FWIW - os documentos padrão para começar recomendam que você faça exatamente isso. golang.org/doc/install
Mike Buckbee

Respostas:

46

Atualização 2020: desde Go 1.11 e a introdução dos módulos Go , GOPATHnão é mais necessário por projeto, e o padrão é~/go para ferramentas / projetos globais que você faria go get.

Vá 1,16 (Q1 2020) deve padrão GOBINpara GOPATH[0]/bin .

Mas, por enquanto, para qualquer projeto usando módulos, você não teria mais uma mensagem de erro como " go install: no install location ...".


Resposta original 2014:

Verifique sua GOPATHvariável.
Certificar-se de que:

  • suas fontes estão sob GOPATH/src
  • você tem uma binpasta dentro de sua pasta GOPATH.

Veja a variável de ambiente GOPATH (onde 'DIR' é uma GOPATHpasta):

O bindiretório contém comandos compilados.
Cada comando é nomeado de acordo com seu diretório de origem, mas apenas o elemento final, não o caminho inteiro. Ou seja, o comando com source in DIR/src/foo/quuxestá instalado em DIR/bin/quux, não DIR/bin/foo/quux. O foo/prefixo " " é removido para que você possa adicionar DIR/binao seu PATHpara obter os comandos instalados.

Se a GOBINvariável de ambiente for definida, os comandos serão instalados no diretório que ele nomeia em vez de DIR/bin. GOBINdeve ser um caminho absoluto.


Por exemplo, este thread ilustra o que acontece no caso em que uma construção go é feita fora de GOPATH/src:

Parece que o seu GOPATHestá definido para, ~/gomas você executou o go installcomando em~/dev/go

Veja Go Build

O caminho Go é uma lista de árvores de diretório contendo o código-fonte Go. É consultado para resolver as importações que não podem ser encontradas na árvore Go padrão.

Se tiver feito isso go build, você também pode tentar um go install(não custom.go): você deseja instalar o pacote, não um único arquivo.

VonC
fonte
você quer dizer isso? Eu echo $ PATH e obtive este: / Usuários / 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

Eu defini o caminho GOBIN e funcionou para mim

export GOBIN=[WorkspacePath]/bin
Pratik Goenka
fonte
2
sim, esta é a resposta correta. basta criar / bin nesse GOPATH
swdev
7
Após o caminho de exportação, recebi o erro cannot install, GOBIN must be an absolute path:(
lee
@lee Você usou ..ou ~no caminho que especificou? Recebi esse erro e apenas mudei para um caminho absoluto como /home/ben/bin/ou uniforme $HOME/bin/. Meu comando completo era (em fishshell, vá para v1.11) env GOBIN=$HOME/bin/ go install testfile.go.
Benny Jobigan
40

Como um iniciante, encontrei este erro quando estava tentando vários comandos go (construir, executar e instalar). Resumindo, você não pode instalar um filename.go . Você só pode instalar um pacote.

Isso era confuso, porque eu havia aprendido que:

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

funciona bem. Mas não consegui descobrir por que a instalação não funcionava:

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)

Não importa em qual diretório eu estava:

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)

Essa confusão ocorre porque o go run funciona apenas com arquivos de origem Go (nomes de arquivo que terminam em .go) e o go install aceita apenas pacotes. Os pacotes são nomeados por seus caminhos de importação ou caminho do sistema de arquivos. Portanto:

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

tudo funciona muito bem. O primeiro se refere ao pacote por caminho de importação (dado que $ GOPATH = "/ home / nate / work", as ferramentas go procuram o código-fonte em / home / nate / work / src), os outros são interpretados como sistema de arquivos caminhos por causa dos períodos iniciais.

Veja também os documentos GOPATH .

Nate Green
fonte
1
esta é a solução real IMO. go installfunciona em diretórios e se você especificar um arquivo go em particular, isso pode causar esse problema específico.
senseiwu
13

Na verdade, existem 2 tipos diferentes de comportamento.

go install <package>

isso está documentado em Compilar e instalar pacotes e dependências. Você não precisa de GOBIN se definir GOPATH corretamente.

go install <gofile>

isso não está documentado e você precisa da variável GOBIN env neste modo.

PickBoy
fonte
1
go install <gofile>está documentado, no go help packagesqual go install --helpse refere a. O problema é que go install(em 1.9.2 e anteriores) tem comportamento inconsistente, em um caso requer e em outro não requer que GOBIN seja explicitamente definido.
Stevo Slavić
7

Como respostas anteriores apontaram, se seu env GOPATH estiver configurado corretamente para sua área de trabalho, você não precisa configurar a variável env GOBIN.

Verifique suas variáveis ​​de ambiente go executando $ go env | grep -i "^ GO" e procure GOROOT e GOPATH para verificar se GOROOT está apontando para a instalação de origem do GO e GOPATH apontando para sua área de trabalho.

Se tudo estiver correto, navegue até o subdiretório onde reside seu pacote.go e execute $ go build (sem nome de arquivo) primeiro e $ go install (novamente sem o nome do arquivo) em segundo lugar, se não houver nenhuma mensagem de erro na tela, pacote está pronto em sua área de trabalho / pkg / youros /../ yourpackage.a

user42754
fonte
7

No Windows com cygwin, parece ser uma boa ideia configurar GOBIN para $ GOPATH / bin.

e lembre-se de escapar adequadamente do separador de nome de arquivo do 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 Binding
fonte
5

Para *nixsistema, veja onde goestá instalado, executando o seguinte comando:

$ which go

qual saída vamos dizer:

/usr/local/go/bin/go

em seguida, adicione as seguintes entradas em ~/.bash_profileou em ~/.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

PS: Não se esqueça da fonte ~/.bash_profileou ~/.zshrc, da seguinte forma:

$ source ~/.bash_profile
Arpit Aggarwal
fonte
4
Você realmente deseja que os executáveis ​​de desenvolvimento sejam incluídos /usr/local/go/bin?
Dolph de
1

Em relação à configuração da GOBINversão da variável, não exigindo e contando apenas com GOPATH:

  1. GOBINé necessário se não tivermos um pacote, ou seja, o arquivo está diretamente no GOPATHdiretório. Isso é provável quando estamos testando os recursos do Go como alunos

  2. Para projetos Go típicos, os arquivos estão nos diretórios do pacote. Para estes, GOPATHé bom o suficiente.

  3. Em outras palavras, as duas soluções a seguir funcionariam: a. Definido GOBINexplicitamente como $ GOPATH / bin [apenas para fins de aprendizagem, pode evitar] b. Crie um subdiretório que seria o nome do seu pacote e mova os arquivos .go para ele

  4. Eu acho que os utilitários Go devem remover o erro acima e lidar melhor com o cenário - com base em se o argumento é um diretório ou um arquivo de origem

pr-pal
fonte
1

Para usuários WINDOWS

Abra um prompt de comando ( Win+ re digite cmd) ou uma janela do PowerShell ( Win+ xe digite i).

Configurando o GOPATH

NOTA: GOPATH não deve ser o mesmo caminho da instalação do Go.

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

Mais detalhes no link abaixo https://github.com/golang/go/wiki/SettingGOPATH#windows

Configurando GOBIN

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

Recomendo verificar o exemplo de código fornecido por golang. Isto me ajudou bastante. https://golang.org/doc/code.html#Command

Henry
fonte
1

No Windows:

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

Confirme com o go envcomando que GOBIN está definido, então o go installcomando salva corretamente o executável no diretório bin.

Frankie Wong
fonte
1

Eu também tive o mesmo problema (GOBIN não precisa ser definido separadamente), certifique-se de ter o seguinte

  1. GOPATH está definido (isso também define GOBIN automaticamente como $ GOPATH / bin)
  2. GOPATH tem os seguintes diretórios bin, pkg, src
  3. custom.go é colocado em src / <your_module>
  4. então corra go install <your_module>
  5. você pode encontrar a verificação do binário compilado (<your_module>) na pasta bin
Manjunath Bhadrannavar
fonte
0

Você não precisa de $ GOBIN se configurou um $ GOPATH corretamente. Nesse caso, simplesmente verifique novamente se o seu projeto reside na pasta $ GOPATH / src .

theVoogie
fonte
0

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

GOBIN O diretório onde 'go install' instalará um comando.

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

Se a variável de ambiente GOBIN for definida, os comandos serão instalados no diretório que ele nomeia em vez de DIR / bin. GOBIN deve ser um caminho absoluto.

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

No modo de reconhecimento de módulo, GOPATH não define mais o significado das importações durante uma construção, mas ainda armazena dependências baixadas (em GOPATH / pkg / mod) e comandos instalados (em GOPATH / bin, a menos que GOBIN esteja definido).

Portanto, parece que basicamente você pode usar GOBIN para substituir temporária ou permanentemente o local de instalação binário padrão (ou seja $GOPATH/bin). Tive sucesso ao instalar um arquivo 1 vá "script" usando env GOBIN=$HOME/bin/ go install testfile.go. Isso foi feito usando go v1.11.

Benny Jobigan
fonte
0

Tentar

export GOROOT=""

export PATH=$PATH:$GOROOT/bin

Thiên Trần
fonte