O Que São os Go Modules? O Gerenciamento de Dependências do Go Explicado
Os Go modules são o sistema de dependências embutido do Go: o go.mod declara seu módulo e seus requisitos, e o go.sum os trava para builds reproduzíveis.
Os Go modules substituíram o antigo modelo de workspace GOPATH e deram ao Go dependências versionadas e reproduzíveis. Com os modules, qualquer diretório contendo um go.mod é um projeto construível, e a toolchain do Go cuida de buscar e verificar tudo de que precisa.
O que são os Go modules
Um Go module é uma coleção de pacotes com um arquivo go.mod em sua raiz que declara o caminho do módulo, a versão do Go e as dependências requeridas. O arquivo complementar go.sum registra os checksums criptográficos de cada dependência para que a toolchain possa verificar que elas não mudaram.
Como funcionam
Quando você importa um pacote e faz o build, o Go resolve as versões necessárias usando seleção de versão mínima e as baixa por meio de um proxy de módulos, fazendo cache delas localmente. O go.mod é atualizado com os requisitos e o go.sum com seus checksums. Isso torna os builds reproduzíveis: o mesmo go.mod e go.sum produzem o mesmo conjunto de dependências em todos os lugares.
Um exemplo de uso
Inicialize um módulo, adicione uma dependência importando e organizando com o tidy.
# create a module
go mod init example.com/myapp
# add or prune dependencies to match the code
go mod tidy
# build and test
go build ./...
go test ./...Papel no CI/CD
No CI, "go build" e "go test" resolvem dependências a partir do go.mod, e a verificação do go.sum protege contra adulteração. Rodar "go mod verify" ou checar que "go mod tidy" não produz diff detecta drift de dependências. Fazer cache do cache de módulos do Go e do cache de build entre execuções evita rebaixar e recompilar, o que acelera cada job.
Alternativas
Antes dos modules, o Go usava o GOPATH mais ferramentas de terceiros como dep e glide; os modules tornaram essas obsoletas. Dentro da era dos modules, as únicas escolhas são detalhes de configuração como qual proxy de módulos usar. Para monorepos muito grandes, alguns times adicionam o Bazel por cima, mas o go.mod continua sendo a base.
Principais conclusões
- Os Go modules gerenciam dependências via go.mod (requisitos) e go.sum (checksums).
- Eles tornam os builds reproduzíveis e substituíram o antigo modelo GOPATH.
- Faça cache dos caches de módulo e de build no CI; verifique o go.sum para evitar drift.