Go get de repositório privado: por que é um problema para iniciantes?
Você escreveu um pacote Go incrível, enviou para um repositório privado no GitHub e agora quer usá-lo em outro projeto. Você executa go get github.com/seunome/secret-lib — e recebe o erro 403 Forbidden ou remote: Repository not found. Familiar?
Essa situação é uma das armadilhas mais comuns para desenvolvedores Go iniciantes. A pergunta no Stack Overflow "What's the proper way to 'go get' a private repository?" tem milhares de visualizações. O problema é que go get por padrão usa HTTPS, não SSH, e não conhece suas credenciais.
Neste artigo, abordaremos três maneiras funcionais de configurar go get para repositórios privados: através de .gitconfig, .netrc e da variável de ambiente GOPRIVATE. Você aprenderá como evitar erros e economizar horas de depuração.
Por que o go get não funciona com repositórios privados?
Por padrão, go get tenta baixar o módulo via HTTPS. Para repositórios públicos, isso é aceitável — o acesso anônimo funciona. Mas repositórios privados exigem autenticação. O Go não sabe como inserir login/senha ou token automaticamente.
O segundo problema é o mecanismo de descoberta de módulos. O Go primeiro verifica se o repositório existe no GitHub/GitLab/Bitbucket, analisando a página HTML. Para repositórios privados, essa página não está disponível sem autorização. Daí o erro repository not found, embora o repositório exista.
Método 1: editando ~/.gitconfig (o mais simples)
O caminho mais fácil é forçar o Git a usar SSH em vez de HTTPS para um domínio específico. Adicione as seguintes linhas ao arquivo ~/.gitconfig:
[url "git@github.com:"] insteadOf = https://github.com/Agora, qualquer requisição para https://github.com/ será automaticamente substituída por SSH. Certifique-se de ter uma chave SSH configurada e adicionada à sua conta GitHub/GitLab.
Verificamos:
go get github.com/sua-org/repo-privado# Funciona sem erros!Importante: este método altera o comportamento para todos os repositórios no GitHub. Se você precisar apenas de um, use uma configuração mais precisa:
[url "git@github.com:sua-org/"] insteadOf = https://github.com/sua-org/Método 2: .netrc para tokens e senhas
Se você prefere HTTPS (por exemplo, em CI/CD), use o arquivo ~/.netrc. O Go sabe ler este arquivo e inserir as credenciais.
Crie o arquivo ~/.netrc com permissões 600:
machine github.comlogin seu-usuario-githubpassword seu-personal-access-tokenOnde obter o token? No GitHub: Settings → Developer settings → Personal access tokens → Generate new token. Selecione as permissões repo (para repositórios privados).
Depois disso:
go get github.com/sua-org/repo-privadoPara GitLab:
machine gitlab.comlogin seu-usuario-gitlabpassword seu-token-acesso-gitlabEste método é ideal para CI/CD, onde chaves SSH nem sempre são fáceis de armazenar.
Método 3: GOPRIVATE — salva-vidas para módulos
A variável de ambiente GOPRIVATE diz ao Go: "Ei, esses módulos são privados, não tente verificá-los através do proxy público e não acesse suas páginas HTML". Isso resolve o problema de "repository not found".
Defina no terminal (ou adicione em ~/.bashrc / ~/.zshrc):
export GOPRIVATE=github.com/sua-org/*Agora, o Go ignorará o proxy público de módulos (proxy.golang.org) para todos os repositórios da sua organização. O comando go get funcionará corretamente.