Golang: GOPATH e Go Modules (Parte - 2)
Já instalei e configurei o Go no VS Code. Se você ainda não fez isso, é só acessar o site oficial e seguir o guia: text. Depois de instalar, é importante entender como o Go organiza o código e gerencia as dependências.
GOPATH
O GOPATH foi o primeiro jeito que o Go usou para organizar projetos e gerenciar dependências. Basicamente, ele é uma pasta principal onde ficam todos os seus códigos e as bibliotecas que você usa.
Se você rodar o comando go env
no terminal, vai ver várias variáveis de ambiente, incluindo o GOPATH. É nesse diretório que o Go procura pacotes e onde você deveria colocar seus projetos.
Outra pasta importante que aparece no comando é a GOMODCACHE
. É lá que o Go guarda os módulos que você baixa. Isso evita que você precise baixar as mesmas dependências toda vez que compila o código.
Dentro do GOPATH, você vai encontrar três pastas principais:
- src: Onde ficam os códigos-fonte dos seus projetos e das dependências.
- pkg: Onde o Go armazena os arquivos compilados dos pacotes.
- bin: Onde ficam os binários gerados pelo comando
go install
.
Apesar de funcionar, essa estrutura tinha algumas limitações:
- Você era obrigado a seguir uma estrutura de diretórios específica.
- Era complicado gerenciar várias versões de dependências.
- Não dava para criar projetos fora do GOPATH.
Go Modules
Antes do Go Modules, o Go não tinha um sistema de controle de versões como o node_modules
no JavaScript ou o pip
no Python. Isso mudou com o Go 1.11, quando os módulos foram introduzidos, e a partir do Go 1.13 eles se tornaram o padrão.
Com o Go Modules, você pode criar projetos em qualquer pasta, sem depender do GOPATH. Ele usa um arquivo chamado go.mod
para listar as dependências do projeto e suas versões. Esse arquivo é criado automaticamente quando você inicializa um módulo com o comando:
go mod init <nome_do_modulo>
Por exemplo, se você rodar go mod init app
, o arquivo go.mod
vai ficar assim:
module app
go 1.24.1
Se precisar de uma dependência externa, como o framework web github.com/gin-gonic/gin
, basta rodar:
go get -u github.com/gin-gonic/gin
O -u
serve para atualizar o pacote e suas dependências para as versões mais recentes. Sem ele, o Go só instala o pacote sem mexer nas dependências já existentes.
Ah, e uma coisa importante: a partir do Go 1.17, o comando go get
não é mais usado para instalar binários. Agora, ele serve apenas para gerenciar dependências no go.mod
. Para instalar binários, o comando recomendado é o go install
.
Quando você instala uma dependência, o Go cria ou atualiza dois arquivos:
go.mod
: Lista as dependências do projeto.go.sum
: Garante que as versões das dependências sejam sempre as mesmas, mesmo que algo mude no repositório original.
Alguns comandos úteis para trabalhar com módulos:
go mod tidy
: Remove dependências que não estão sendo usadas e atualiza ogo.mod
e ogo.sum
.go mod download
: Faz o download das dependências para o cache local, mas não as instala.go mod graph
: Mostra como as dependências estão conectadas.go mod verify
: Verifica se as dependências estão corretas e se os hashes nogo.sum
batem com os arquivos baixados.go mod edit
: Permite editar ogo.mod
manualmente.go mod list -m
: Lista as dependências do módulo com detalhes.go mod vendor
: Cria uma cópia local das dependências no diretóriovendor
, útil para trabalhar offline.
Com os módulos, o gerenciamento de dependências no Go ficou muito mais simples e flexível.