Por que o "go get" quebrou e como corrigir isso?
\nSe você já se perguntou "How can I install a package with go get?" — você não está sozinho. Esta pergunta acumulou milhares de visualizações no Stack Overflow, e não é à toa. Antes era simples: go get github.com/some/package — e a biblioteca estava em $GOPATH/src. Mas após o lançamento do Go 1.16, tudo mudou. Agora, go get não instala mais pacotes no sentido tradicional. Em vez disso, ele apenas atualiza o go.mod. E para instalação de binários, surgiu o comando go install.
Neste artigo, vamos entender o que aconteceu, como instalar pacotes e dependências corretamente agora, e por que os iniciantes ficam tão confusos. Vamos lá!
\n\nBreve história: do GOPATH aos módulos
\nAntes da versão Go 1.11, todo o código ficava no GOPATH — uma pasta especial onde estavam todos os seus projetos e pacotes de terceiros. O comando go get baixava os fontes diretamente para lá. Era conveniente, mas gerava problemas de versão: se dois projetos exigissem versões diferentes da mesma biblioteca — começava o caos.
Com a chegada dos Go modules (a partir do Go 1.11 e estável desde o 1.16), cada projeto ganhou seu próprio go.mod — um arquivo que lista as dependências e suas versões. Agora, o go get funciona de forma diferente:
- \n
- Adiciona a dependência ao
go.mod\n - Baixa para o cache (geralmente
$GOPATH/pkg/mod) \n - Não cria um binário em
$GOPATH/bin\n
Se você precisa instalar um programa pronto (por exemplo, um utilitário de linha de comando) — use go install.
Como o go get funciona agora: análise passo a passo
\nAbra o terminal e crie um novo módulo:
\nmkdir myproject\ncd myproject\ngo mod init myproject\nAgora, queremos adicionar, por exemplo, a popular biblioteca gorilla/mux para roteamento. Antes, escreveríamos:
go get github.com/gorilla/mux\nE isso funcionaria — a biblioteca seria baixada. Mas veja o que acontece:
\n- \n
- Em
go.modaparece a linha:require github.com/gorilla/mux v1.8.0\n - Na pasta do projeto, surge
go.sum— um arquivo com somas de verificação para segurança \n - Os fontes da biblioteca ficam no cache, não ao lado do projeto \n
Agora, no seu código, você pode importar o pacote:
\npackage main\n\nimport (\n "fmt"\n "github.com/gorilla/mux"\n)\n\nfunc main() {\n r := mux.NewRouter()\n fmt.Println("Router created!")\n}\nExecute go run main.go — tudo funciona. Mas se você queria obter um binário (programa compilado) — o go get não fornecerá isso.
Instalação de binários: go install vem em socorro
\nSuponha que você encontrou um utilitário legal em Go, como golangci-lint — um linter para código. Para instalá-lo como um comando no sistema, antes escrevíamos:
go get github.com/golangci/golangci-lint/cmd/golangci-lint\nAgora, isso não funciona (exibe um aviso). A maneira correta é:
\ngo install github.com/golangci/golangci-lint/cmd/golangci-lint@latest\nO que acontece:
\n- \n
- O Go baixa os fontes do utilitário \n
- Compila-os \n
- Coloca o binário pronto em
$GOPATH/bin(ou$GOBIN, se a variável estiver definida) \n
Certifique-se de que $GOPATH/bin está adicionado ao PATH — caso contrário, o comando não estará disponível. Você pode verificar assim:
echo $GOPATH\n# geralmente /home/user/go\nls ~/go/bin/\nSe o seu binário estiver lá — está tudo certo.
\n\nErros típicos de iniciantes (e como evitá-los)
\nNo Stack Overflow, as perguntas mais comuns são sobre esses problemas:
\n- \n
- "go get não cria a pasta src"
Blogs
Book Recommendations
Leia também
Open source para desenvolvedores JS: por onde começar a contribuir e não se queimar
Programação Assíncrona em Go: Guia Completo para Iniciantes
Fold vs Reduce em Kotlin: quando usar cada um? Análise completa
Principais erros de desenvolvedores TypeScript iniciantes: de A a Z
Argumentos de linha de comando em Rust: guia completo para iniciantes