Workspace Mode

Workspace Mode para desenvolvimento com múltiplos módulos simultaneamente

O que é Workspace Mode?

Workspace Mode (Modo Workspace) foi introduzido no Go 1.18 (março de 2022) e permite que você trabalhe com múltiplos módulos simultaneamente em um ambiente de desenvolvimento compartilhado.

Problema que resolve

Antes do Workspace Mode (Go ≤ 1.17)

Imagine que você está desenvolvendo dois módulos: app e library. O app depende de library:

# Para testar mudanças locais em library, você precisava:
# 1. Editar app/go.mod adicionando:
replace github.com/user/library => ../library

# 2. Desenvolver e testar
# 3. LEMBRAR de remover a diretiva replace antes de fazer commit
# 4. Publicar library
# 5. Atualizar app para usar a versão publicada

Isso era trabalhoso, especialmente com muitos módulos!

Com Workspace Mode (Go ≥ 1.18)

Estrutura do arquivo go.work

O arquivo go.work tem sintaxe similar ao go.mod:

Diretivas do go.work

Diretiva
Descrição
Exemplo

go

Versão do Go para interpretar o arquivo

go 1.25

use

Módulos ativos no workspace

use ./module-path

replace

Sobrescreve módulos (opcional)

replace foo => bar v1.0.0

toolchain

Especifica toolchain do Go (Go 1.21+)

toolchain go1.25.0

Como funciona?

Quando um arquivo go.work existe, o comando go:

  1. Trata todos os módulos listados em use como módulos principais

  2. Resolve importações preferindo os módulos do workspace

  3. Permite executar comandos em qualquer módulo a partir da raiz do workspace

  4. Sincroniza dependências entre os módulos quando solicitado

O arquivo go.work é local e não deve ser commitado no repositório. Adicione go.work ao .gitignore.

Criando um Workspace

Método 1: Inicialização com módulos

Método 2: Adicionar módulos recursivamente

Exemplo Prático Completo

Cenário: Desenvolvendo uma aplicação e uma biblioteca juntas

Modificando a biblioteca

Comandos de Workspace

go work init

Cria um novo arquivo go.work:

go work use

Adiciona ou remove módulos do workspace:

go work sync

Sincroniza dependências do workspace para os módulos:

go work edit

Edita o arquivo go.work:

go work vendor (Go 1.22+)

Cria um diretório vendor para o workspace inteiro:

Variáveis de Ambiente

GOWORK

Controla qual arquivo workspace usar:

Casos de Uso

1. Desenvolvimento Local de Dependências

Trabalhar em uma aplicação e suas bibliotecas simultaneamente:

2. Monorepos

Gerenciar múltiplos serviços em um único repositório:

3. Contribuindo para Projetos Open Source

Testar mudanças em um projeto que você está contribuindo:

Workflow de Release

Quando estiver pronto para publicar:

1. Publicar a biblioteca

2. Atualizar a aplicação

3. O workspace continua funcionando

Mesmo após publicar, o workspace continua usando a versão local para desenvolvimento contínuo.

Melhores Práticas

✅ Faça

  • Adicione go.work e go.work.sum ao .gitignore

  • Use workspace para desenvolvimento local

  • Documente no README como configurar o workspace para novos desenvolvedores

  • Use go work sync periodicamente para manter dependências sincronizadas

❌ Não faça

  • Nunca comite go.work no repositório (é pessoal)

  • Não confie em workspace para builds de produção

  • Não use replace no go.work se puder evitar (prefira no go.mod se necessário)

  • Não esqueça de testar sem o workspace antes de release

Troubleshooting

Problema: "package X is not in GOROOT or in any module"

Problema: Versões de dependências conflitantes

Problema: Build funciona localmente mas falha no CI/CD

go.work.sum

Similar ao go.sum, o arquivo go.work.sum contém checksums das dependências usadas no workspace.

Comparação: replace vs workspace

Característica
replace (go.mod)
workspace (go.work)

Onde

Dentro do módulo

Fora dos módulos

Escopo

Um módulo

Múltiplos módulos

Commit

Sim (com cuidado)

Não (sempre local)

Uso

Override permanente

Desenvolvimento local

Afeta CI

Sim

Não

Recursos Adicionais

Conclusão

Workspace Mode é uma ferramenta poderosa para desenvolvimento local com múltiplos módulos. Ele simplifica o workflow, elimina a necessidade de diretivas replace temporárias, e torna o desenvolvimento em monorepos muito mais agradável.

Last updated