Padrões Git de Monorepo com go work
Um único repositório Git pode hospedar múltiplos módulos Go coordenados por go.work durante o desenvolvimento.
Busque em todas as páginas da documentação
Um único repositório Git pode hospedar múltiplos módulos Go coordenados por go.work durante o desenvolvimento.
O histórico do Git permanece unificado enquanto cada módulo mantém seu próprio go.mod, tags e grafo de consumidores.
Monorepos são adequados para equipes de plataforma que enviam bibliotecas e serviços compartilhados juntos.
Use go.work localmente para substituir diretivas replace entre módulos em arquivos go.mod commitados.
Marque e faça CI de cada módulo explicitamente para que proxies e consumidores resolvam as versões corretas.
Cartão de receita de referência rápida - pronto para copiar e colar.
# Layout do repositório
# services/api/go.mod
# libs/auth/go.mod
cd repo-root
go work init ./services/api ./libs/auth
go work use -r . # opcional: descobrir módulos
# Desenvolver entre módulos
cd services/api
go test ./...
# Validar visualização de publicação (sem workspace)
GOWORK=off go test ./...Quando usar isso:
replace específicos da máquina em branches compartilhados.go.mod uns dos outros.acme-platform/
go.work
go.work.sum
libs/telemetry/go.mod # github.com/acme/telemetry
services/billing/go.mod # github.com/acme/billing
// go.work
go 1.26
use (
./libs/telemetry
./services/billing
)# Alterar a API de telemetria e corrigir o faturamento em um único branch
git switch -c feat/telemetry-batch
# editar libs/telemetry/...
# editar services/billing/...
go test ./...
cd services/billing && GOWORK=off go test ./...
git add libs/telemetry services/billing go.work go.work.sum
git commit -m "telemetry: adicionar exportação em lote; billing: adotar API em lote"
git push -u origin feat/telemetry-batchMarque apenas o módulo da biblioteca ao lançar para consumidores externos:
git switch main && git pull --ff-only
cd libs/telemetry
git tag -a v0.4.0 -m "telemetry v0.4.0"
git push origin v0.4.0O que isso demonstra:
go.work conecta implicitamente os replaces locais durante o desenvolvimento.GOWORK=off simula o que os consumidores de módulos experimentam.go.mod na raiz de um subdiretório.go.work na raiz do repositório lista os diretórios dos módulos nas diretivas use.go.mod em um único PR.go.work.sum registra checksums para resolução de workspace, semelhante a go.sum.
Commite go.work quando toda a equipe compartilha o layout do workspace.
Mantenha experimentos pessoais em go.work não rastreado ou substituição de ambiente GOWORK.
| Padrão | Propósito |
|---|---|
| Rótulos de PR com escopo de caminho | Mostrar quais módulos um PR afeta |
| CODEOWNERS por módulo | Roteia a revisão para a equipe proprietária |
Prefixo de tag telemetry/v0.4.0 | Desambigua tags multi-módulo (documentar no README) |
Matriz de CI por go.mod | Feedback mais rápido em repositórios grandes |
GOWORK=off job de release | Verifica o grafo de módulos publicáveis |
| Mecanismo | Commitedo para main compartilhado? | Impacto no consumidor |
|---|---|---|
go.work | Auxílio de desenvolvimento opcional para toda a equipe | Nenhum (não publicado) |
replace em go.mod | Evitar para caminhos locais | Quebra go get para usuários externos |
| require versionado | Sim | Caminho normal do consumidor |
strategy:
matrix:
module: [libs/telemetry, services/billing]
steps:
- run: cd ${{ matrix.module }} && GOWORK=off go test ./...O job de workspace raiz ainda pode executar go test ./... de go.work para confiança na integração.
replace ../libs commitados - Quebram clones externos. Correção: go.work para desenvolvimento local; exigir versões semver em main.internal/ abrange módulos - O compilador impõe por raiz de módulo. Correção: código compartilhado em pacotes publicados ou um único módulo até que a divisão seja real.GOWORK=off em CI de release - Envia surpresas do grafo apenas do workspace. Correção: modo off obrigatório antes da tag.| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Módulo único | Uma linha de release, grafo simples | Semver independente por subsistema |
| Multi-repo | Limites rígidos de equipe | Mudanças atômicas frequentes entre cortes |
| Bazel / build customizado | Orquestração poliglota não-Go | Fluxos de trabalho go command padrão são suficientes |
| Submódulos Git | Separação legada | Ergonomia de módulos Go preferida |
Sim, quando todos os desenvolvedores usam o mesmo conjunto de módulos diariamente.
Não, quando é um superconjunto pessoal de módulos; use um arquivo local não rastreado em vez disso.
Por caminho do módulo em cada go.mod, não pela raiz do repositório.
go get github.com/acme/telemetry@v0.4.0 busca apenas essa subárvore de módulo.
Sim.
Execute testes com o workspace ativado e GOWORK=off para cada módulo afetado antes de mesclar.
Caminhos de módulo separados (/v2) e tags por versão principal.
O workspace pode incluir ambas as linhas durante a migração.
Não.
Ele substitui a resolução localmente; go.mod ainda lista os semver requires pretendidos para os consumidores.
Extraia o histórico com filter-repo ou copie a subárvore, publique o novo caminho do módulo, retifique os caminhos antigos se necessário.
Planeje a migração do caminho de importação no changelog.
Possível em cada raiz de módulo.
Atualize o vendor no PR que atualiza apenas as dependências desse módulo.
Os mesmos padrões de trunk de repositórios de módulo único.
Adicione o nome do módulo no branch (feat/telemetry-batch) para clareza.
go.work suporta blocos replace para substituições locais.
Prefira caminhos use em vez de replaces absolutos frágeis.
Use filtros de caminho e git diff --name-only para selecionar entradas da matriz.
Ainda execute integrações completas periódicas do workspace em main.
Raramente vale a pena.
Módulos Go já versionam dependências; submódulos adicionam atrito de VCS.
Declare qual módulo cada tag versiona, o branch padrão e os comandos de verificação GOWORK=off para mantenedores.
Versões da Pilha: Esta página foi escrita para Go 1.26.x (padrão Green Tea GC, modernizadores go fix - verifique o patch na compilação), chi (última versão - verifique na compilação), gin (última versão - verifique na compilação), echo (última versão - verifique na compilação), google.golang.org/grpc (última versão - verifique na compilação), sigs.k8s.io/controller-runtime (última versão - verifique na compilação), kubebuilder (última versão - verifique na compilação), tinygo (última versão - verifique os alvos de placa na compilação), wazero (última versão - verifique na compilação) e golangci-lint (última versão - verifique o conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 18 de jul. de 2026