"Instalei um pacote, mas não consigo removê-lo!" — Uma história familiar?
\n\nVocê está começando a estudar Go, encontra uma biblioteca incrível no GitHub, digita go get github.com/example/package — e tudo funciona! Mas o tempo passa, o projeto muda e você percebe: esse pacote não é mais necessário. Você procura pelos comandos go remove ou go uninstall, mas... eles simplesmente não existem.
Bem-vindo ao mundo do Go, onde remover pacotes não é um botão, mas sim uma pequena aventura. Neste artigo, vamos entender para onde os pacotes vão após o go get, como "despejá-los" corretamente e por que o Go foi projetado dessa forma. Spoiler: depois de ler, você não terá mais medo da bagunça no sistema e aprenderá a manter seus projetos limpos e organizados.
Como o go get funciona: uma breve introdução
\n\nAntes de remover, vamos entender exatamente para onde o pacote vai. No Go (até a versão 1.16, mas esse conhecimento ainda é relevante), o comando go get baixava o código-fonte do pacote para duas pastas:
- \n
$GOPATH/src— o código-fonte do pacote (como se você tivesse clonado o repositório); \n $GOPATH/pkg— os arquivos de objeto compilados (.a). \n
Se você usa Go modules (e a partir da versão 1.16 esse é o modo padrão), o go get funciona de forma diferente: ele adiciona a dependência ao go.mod e baixa o módulo para o cache ($GOPATH/pkg/mod).
O problema é que o Go não possui um comando nativo para "remover pacotes". Os desenvolvedores da linguagem acreditam que, se um pacote não é mais necessário, basta não importá-lo no código. Isso faz sentido, mas o que fazer quando você quer liberar espaço ou organizar tudo?
\n\nMétodo #1: go clean -i (para projetos antigos sem módulos)
\n\nAntigamente (antes da era dos módulos), existia o comando go clean -i. Ele removia os arquivos compilados do pacote de $GOPATH/pkg. Mas o código-fonte não era tocado. Ou seja, você removia apenas os artefatos binários, mas o código permanecia em src.
# Remove os arquivos compilados do pacote\ngo clean -i github.com/example/package\n\n# O código-fonte ainda está aqui:\nls $GOPATH/src/github.com/example/package\n\nNa prática, isso era inconveniente. Por isso, nas versões modernas do Go (a partir da 1.12), o go clean -i foi declarado obsoleto. Se você executar go clean -i hoje, o Go simplesmente ignorará a flag -i e executará o go clean padrão (removendo arquivos objeto no projeto atual).
Método #2: Remoção manual do GOPATH (para veteranos)
\n\nSe você ainda trabalha sem módulos (ou apenas quer limpar resquícios antigos), terá que fazer manualmente. Aqui está a receita completa:
\n\n- \n
- Descubra onde está o seu
$GOPATH: \n
go env GOPATH\n\nGeralmente é /home/usuario/go ou C:\\Users\\usuario\\go.
- \n
- Remova o código-fonte: \n
rm -rf $GOPATH/src/github.com/example/package\n\n- \n
- Remova os arquivos compilados (se existirem): \n
rm -rf $GOPATH/pkg/linux_amd64/github.com/example/package.a\n\n\n\n\nImportante: O caminho para o arquivo
\n.adepende do seu sistema operacional e arquitetura.linux_amd64é um exemplo típico. Você pode descobrir o caminho exato comgo list -m, mas é mais simples remover toda a pasta do pacote dentro depkg.
Esse método funciona, mas é "sujo". Você corre o risco de remover algo importante acidentalmente. Além disso, se o pacote for usado em outros projetos, eles quebrarão.
\n\nMétodo #3: A abordagem moderna — go mod tidy
\n\nSe você usa Go modules (e deveria usá-los se começou a estudar em 2024), tudo é muito mais elegante. Quando você para de importar um pacote no seu código, ele automaticamente deixa de ser