go work: Modo de Workspace para Repositórios Multi-Módulo
go.work permite compilar vários módulos juntos usando código-fonte local em vez de versões publicadas.
Busque em todas as páginas da documentação
go.work permite compilar vários módulos juntos usando código-fonte local em vez de versões publicadas.
É a maneira suportada de desenvolver monorepos multi-módulo sem espalhar diretivas replace temporárias em cada go.mod.
O modo de workspace adiciona um arquivo go.work listando diretórios de módulos com diretivas use.
Quando GOWORK aponta para esse arquivo (detectado automaticamente em diretórios pais), a toolchain resolve esses módulos para caminhos locais.
Seus arquivos go.mod individuais permanecem publicáveis; a configuração do workspace é tipicamente local ou commitada apenas para orquestração de desenvolvimento em todo o repositório.
Cartão de receita de referência rápida - pronto para copiar e colar.
mkdir -p repo/{app,lib}
cd repo/lib && go mod init example.com/lib
cd ../app && go mod init example.com/app
cd ..
go work init ./app ./lib
go work use ./app ./libcd app
go run .Quando usar isso:
replace => ../lib commitadas que quebram em diferentes layouts de máquina.repo/
go.work
app/
go.mod
main.go
lib/
go.mod
greet.go
// lib/greet.go
package lib
func Greet() string { return "hello from lib" }// lib/go.mod
module example.com/lib
go 1.26// app/go.mod
module example.com/app
go 1.26
require example.com/lib v0.0.0// app/main.go
package main
import (
"fmt"
"example.com/lib"
)
func main() {
fmt.Println(lib.Greet())
}// go.work
go 1.26
use (
./app
./lib
)cd app
go run .O que isso demonstra:
app requer example.com/lib sem uma pseudo-versão ou replace em go.mod.go.work diz à toolchain para usar ./lib no disco.app sozinho ainda registra um require adequado para consumidores.go work init cria go.work na raiz do repositório (ou no caminho escolhido).use listam as raízes dos módulos relativas ao arquivo de trabalho.GOWORK=off desabilita o modo de workspace para imitar consumidores externos.replace em go.work (não apenas em go.mod) pode substituir versões em todo o workspace.Os arquivos de workspace não são importados por módulos downstream de suas bibliotecas.
Eles coordenam desenvolvedores e CI de monorepos, não grafos de usuários finais.
| Mecanismo | Escopo | Política de commit típica |
|---|---|---|
go.work + use | Todos os módulos listados em dev | Commit em monorepos para ergonomia de desenvolvimento |
replace em go.mod do app | Compilando o app como principal | Evitar caminhos de máquina em branches compartilhados |
replace em go.mod da biblioteca | Consumidores da biblioteca | Apenas para forks permanentes |
# Adicionar um módulo posteriormente
go work use ./newservice
# Sincronizar go line do workspace com os módulos
go work sync
# Executar testes em todo o workspace
go work edit -json
go test ./...// go.work com replace (nível de workspace)
go 1.26
use (
./app
./lib
)
replace example.com/legacy => ./legacyGOWORK=off em pipelines de release pode ocultar o fato de que código local não publicado é necessário.lib antes que usuários externos possam resolver app.go.work está presente.Sim em monorepos de equipe onde todos desenvolvem múltiplos módulos juntos.
Autores de bibliotecas solo que consomem seu módulo via proxy geralmente o omitem.
Tidy ainda edita o go.mod de cada módulo.
O Workspace afeta a resolução durante a build, não o contrato de publicação dentro de cada módulo.
GOWORK=off go test ./... ou renomeie/mova go.work para uma única sessão de comando.
Os caminhos use são diretórios do sistema de arquivos.
Módulos remotos ainda são baixados, a menos que você adicione replace em go.work.
Alinha as linhas da toolchain go entre os módulos do workspace e pode atualizar as diretivas use após mudanças nos módulos.
Não - eles resolvem versões do proxy de módulo por go.mod do app.
Você deve marcar e publicar releases de lib.
Cada módulo precisa de sua própria raiz go.mod em use.
O Workspace não achata grafos aninhados automaticamente.
Vendor roda por módulo principal; o workspace ainda resolve locais primeiro.
Verifique builds com -mod=vendor em CI sem go.work ao testar a publicabilidade.
Quantos você desenvolve ativamente em conjunto.
Divida workspaces quando produtos não relacionados compartilham um repositório Git, mas não a cadência de release.
Conceitualmente semelhante para linking local, mas Go mantém arquivos go.mod e MVS separados por módulo.
Versões da Stack: Esta página foi escrita para Go 1.26.x (GC padrão Green Tea, modernizadores go fix - verifique o patch na build), chi (latest - verifique na build), gin (latest - verifique na build), echo (latest - verifique na build), google.golang.org/grpc (latest - verifique na build), sigs.k8s.io/controller-runtime (latest - verifique na build), kubebuilder (latest - verifique na build), tinygo (latest - verifique os alvos de placa na build), wazero (latest - verifique na build), e golangci-lint (latest - verifique o conjunto de linters na build).
Revisado por Chris St. John·Última atualização: 19 de jul. de 2026