Domando o go get: instalação de pacotes em Go para iniciantes

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Por que o "go get" quebrou e como corrigir isso?

\n

Se 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.

\n

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\n

Breve história: do GOPATH aos módulos

\n

Antes 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.

\n

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
    \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
\n

Se você precisa instalar um programa pronto (por exemplo, um utilitário de linha de comando) — use go install.

\n\n

Como o go get funciona agora: análise passo a passo

\n

Abra o terminal e crie um novo módulo:

\n
mkdir myproject\ncd myproject\ngo mod init myproject
\n

Agora, queremos adicionar, por exemplo, a popular biblioteca gorilla/mux para roteamento. Antes, escreveríamos:

\n
go get github.com/gorilla/mux
\n

E isso funcionaria — a biblioteca seria baixada. Mas veja o que acontece:

\n
    \n
  1. Em go.mod aparece a linha: require github.com/gorilla/mux v1.8.0
  2. \n
  3. Na pasta do projeto, surge go.sum — um arquivo com somas de verificação para segurança
  4. \n
  5. Os fontes da biblioteca ficam no cache, não ao lado do projeto
  6. \n
\n

Agora, no seu código, você pode importar o pacote:

\n
package main\n\nimport (\n    "fmt"\n    "github.com/gorilla/mux"\n)\n\nfunc main() {\n    r := mux.NewRouter()\n    fmt.Println("Router created!")\n}
\n

Execute go run main.go — tudo funciona. Mas se você queria obter um binário (programa compilado) — o go get não fornecerá isso.

\n\n

Instalação de binários: go install vem em socorro

\n

Suponha 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:

\n
go get github.com/golangci/golangci-lint/cmd/golangci-lint
\n

Agora, isso não funciona (exibe um aviso). A maneira correta é:

\n
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
\n

O 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
\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:

\n
echo $GOPATH\n# geralmente /home/user/go\nls ~/go/bin/
\n

Se o seu binário estiver lá — está tudo certo.

\n\n

Erros típicos de iniciantes (e como evitá-los)

\n

No Stack Overflow, as perguntas mais comuns são sobre esses problemas:

\n