Mesmo que eu tenha GOPATH
definido corretamente, ainda não consigo "ir construir" ou "ir correr" para encontrar meus próprios pacotes. O que estou fazendo de errado?
$ 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
Respostas:
Não funciona porque seu
foobar.go
arquivo de origem não está em um diretório chamadofoobar
.go build
ego install
tente combinar diretórios, não arquivos de origem.$GOPATH
para um diretório válido, por exemploexport GOPATH="$HOME/go"
foobar.go
para$GOPATH/src/foobar/foobar.go
e construir deve funcionar muito bem.Etapas adicionais recomendadas:
$GOPATH/bin
ao seu$PATH
:PATH="$GOPATH/bin:$PATH"
main.go
para uma subpasta de$GOPATH/src
, por exemplo,$GOPATH/src/test
go install test
Agora, você deve criar um executável no$GOPATH/bin
qual possa ser chamado digitandotest
seu terminal.fonte
GOPATH=/usr/local/go-pkgs
, então o Go procura/usr/local/go-pkgs/src/<package-name>
a fonte, mas ago get
coloca/usr/local/go-pkgs/src/gopkg.in/<package-name>
. Por que eu devo mover manualmente todos os meus pacotes após a instalação? Isso é bobagem.go get
normalmente coloca pacotes,$GOPATH/src/
então, se você ligar,go get domain.com/path/to/package
ele terminará$GOPATH/src/domain.com/path/to/package
. Eu acho que você tenta buscar um pacotegopkg.in
? Nesse caso, esse é o comportamento pretendido e você deve apenas importá-los com o nome completo; por exemplo,import "gopkg.in/yaml.v1"
como também descrito nos documentos .Edit: já que você significou GOPATH, consulte fasmat 's resposta (upvoted)
Como mencionado em " Como faço para encontrar meu pacote? ", Você precisa colocar um pacote
xxx
em um diretórioxxx
.Veja a especificação do idioma Go :
A organização do Código menciona:
(um "espaço de trabalho" é uma entrada de caminho no seu
GOPATH
: essa variável pode fazer referência a vários caminhos para o seu 'src, bin, pkg
')(Resposta original)
Você também deve definir
GOPATH
como ~ / go, nãoGOROOT
, conforme ilustrado em " Como escrever o código Go ".Isso é diferente de
GOROOT
:fonte
TL; DR: Siga as convenções do Go! (lição aprendida da maneira mais difícil), verifique as versões antigas e remova -as. Instale mais recente.
Para mim, a solução foi diferente. Trabalhei em um servidor Linux compartilhado e depois de verificar minhas
GOPATH
e outras variáveis de ambiente várias vezes, ele ainda não funcionou. Encontrei vários erros, incluindo 'Não é possível encontrar o pacote' e 'Caminho de importação não reconhecido'. Depois de tentar reinstalar com esta solução, as instruções no golang.org (incluindo a parte de desinstalação ) ainda encontraram problemas.Levei algum tempo para perceber que ainda há uma versão antiga que não tenha sido desinstalado (em execução
go version
, em seguida,which go
novamente ... DAHH) que me levou a esta questão e, finalmente, resolvido.fonte
Embora a resposta aceita ainda esteja correta sobre a necessidade de corresponder diretórios com nomes de pacotes, você realmente precisa migrar para o uso de módulos Go em vez de usar GOPATH. Os novos usuários que encontrarem esse problema podem ficar confusos sobre as menções ao uso do GOPATH (como eu estava), que agora estão desatualizadas. Portanto, tentarei esclarecer esse problema e fornecer orientações associadas à prevenção desse problema ao usar os módulos Go.
Se você já conhece os módulos Go e está enfrentando esse problema, pule para as seções mais específicas abaixo, que abrangem algumas das convenções Go que são fáceis de ignorar ou esquecer.
Este guia ensina sobre os módulos Go: https://golang.org/doc/code.html
Organização do projeto com módulos Go
Depois de migrar para os módulos Go, conforme mencionado nesse artigo, organize o código do projeto conforme descrito:
Você pode inicializar seu módulo assim:
Seu código não precisa estar localizado no github.com para que seja criado. No entanto, é uma boa prática estruturar seus módulos como se eles fossem publicados.
Entendendo o que acontece ao tentar obter um pacote
Há um ótimo artigo aqui que fala sobre o que acontece quando você tenta obter um pacote ou módulo: https://medium.com/rungo/anatomy-of-modules-in-go-c8274d215c16 Ele discute onde o pacote está armazenado e será ajudá-lo a entender por que você pode estar recebendo esse erro se já estiver usando os módulos Go.
Verifique se a função importada foi exportada
Observe que, se estiver com problemas para acessar uma função de outro arquivo, verifique se você exportou sua função. Conforme descrito no primeiro link que forneci, uma função deve começar com uma letra maiúscula para ser exportada e disponibilizada para importação em outros pacotes.
Nomes de diretórios
Outro detalhe crítico (como mencionado na resposta aceita) é que os nomes dos diretórios são os que definem os nomes dos seus pacotes. (Seus nomes de pacotes precisa combinar seus nomes de diretórios.) Você pode ver exemplos disso aqui: https://medium.com/rungo/everything-you-need-to-know-about-packages-in-go-b8bac62b74cc Com Dito isto, o arquivo que contém seu
main
método (ou seja, o ponto de entrada do seu aplicativo) está meio isento desse requisito.Como exemplo, tive problemas com minhas importações ao usar uma estrutura como esta:
Não foi possível importar o código no
utils
meumain
pacote.No entanto, depois que eu coloquei
main.go
em seu próprio subdiretório, como mostrado abaixo, minhas importações funcionaram muito bem:Nesse exemplo, meu arquivo go.mod se parece com o seguinte:
Quando salvei o main.go após adicionar uma referência a
utils.MyFunction()
, meu IDE puxou automaticamente a referência ao meu pacote assim:(Estou usando o VS Code com a extensão Golang.)
Observe que o caminho de importação incluiu o subdiretório no pacote.
Lidar com um repo privado
Se o código fizer parte de um repositório particular, você precisará executar um comando git para ativar o acesso. Caso contrário, você poderá encontrar outros erros. Este artigo menciona como fazer isso para repositórios particulares do Github, BitBucket e GitLab: https://medium.com/cloud-native-the-gathering/go-modules-with-private-git- repositories-dfe795068db4 Este problema também é discutido aqui: Qual é a maneira correta de "obter" um repositório privado?
fonte
Você já tentou adicionar o diretório absoluto de ir para o seu 'caminho'?
fonte