go work: Modo de Espacio de Trabajo para Repositorios Multi-Módulo
go.work te permite compilar varios módulos juntos usando código fuente local en lugar de versiones publicadas.
Busca en todas las páginas de la documentación
go.work te permite compilar varios módulos juntos usando código fuente local en lugar de versiones publicadas.
Es la forma soportada de desarrollar monorepos multi-módulo sin esparcir directivas replace temporales en cada go.mod.
El modo de espacio de trabajo añade un archivo go.work que lista directorios de módulos con directivas use.
Cuando GOWORK apunta a ese archivo (detectado automáticamente en directorios padre), la cadena de herramientas resuelve esos módulos a rutas locales.
Tus archivos go.mod individuales siguen siendo publicables; la configuración del espacio de trabajo es típicamente local o se confirma solo para la orquestación de desarrollo a nivel de repositorio.
Tarjeta de receta de referencia rápida - lista para copiar y pegar.
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 .Cuándo usar esto:
replace => ../lib confirmadas que fallan en diferentes diseños 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 "hola desde 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 .Lo que esto demuestra:
app requiere example.com/lib sin una pseudo-versión o replace en go.mod.go.work le dice a la cadena de herramientas que use ./lib en el disco.app solo todavía registra un require adecuado para los consumidores.go work init crea go.work en la raíz del repositorio (o en la ruta elegida).use listan las raíces de los módulos relativas al archivo de trabajo.GOWORK=off deshabilita el modo de espacio de trabajo para imitar a los consumidores externos.replace en go.work (no solo en go.mod) puede anular versiones en todo el espacio de trabajo.Los archivos de espacio de trabajo no son importados por módulos descendientes de tus bibliotecas.
Coordinan a los desarrolladores y la CI del monorepo, no los grafos de usuarios finales.
| Mecanismo | Ámbito | Política de confirmación típica |
|---|---|---|
go.work + use | Todos los módulos listados en desarrollo | Confirmar en monorepos para ergonomía de desarrollo |
replace en go.mod de la aplicación | Compilando la aplicación como principal | Evitar rutas de máquina en ramas compartidas |
replace en go.mod de la biblioteca | Consumidores de la biblioteca | Solo para forks permanentes |
# Añadir un módulo más tarde
go work use ./newservice
# Sincronizar la línea go del espacio de trabajo con los módulos
go work sync
# Ejecutar pruebas en todo el espacio de trabajo
go work edit -json
go test ./...// go.work con replace (a nivel de espacio de trabajo)
go 1.26
use (
./app
./lib
)
replace example.com/legacy => ./legacyGOWORK=off en los pipelines de lanzamiento puede ocultar el hecho de que se requiere código local no publicado.lib antes de que los usuarios externos puedan resolver app.go.work está presente.Sí, en monorepos de equipo donde todos desarrollan múltiples módulos juntos.
Los autores de bibliotecas individuales que consumen su módulo a través de un proxy generalmente lo omiten.
Tidy todavía edita el go.mod de cada módulo.
El espacio de trabajo afecta la resolución durante la compilación, no el contrato de publicación dentro de cada módulo.
GOWORK=off go test ./... o renombra/mueve go.work para una sola sesión de comando.
Las rutas use son directorios del sistema de archivos.
Los módulos remotos todavía se descargan a menos que agregues replace en go.work.
Alinea las líneas de la cadena de herramientas go en los módulos del espacio de trabajo y puede actualizar las directivas use después de los cambios de módulo.
No, resuelven las versiones del proxy de módulos según el go.mod de la aplicación.
Debes etiquetar y publicar lanzamientos de lib.
Cada módulo necesita su propia raíz go.mod en use.
El espacio de trabajo no aplana los grafos anidados automáticamente.
Vendor se ejecuta por módulo principal; el espacio de trabajo todavía resuelve los locales primero.
Verifica las compilaciones -mod=vendor en CI sin go.work al probar la publicabilidad.
Tantos como co-desarrolles activamente.
Divide los espacios de trabajo cuando productos no relacionados comparten un repositorio Git pero no una cadencia de lanzamiento.
Conceptualmente similar para la vinculación local, pero Go mantiene archivos go.mod y MVS separados por módulo.
Versiones de Stack: Esta página fue escrita para Go 1.26.x (predeterminado de GC Green Tea, modernizadores de go fix - verificar parche en la compilación), chi (última - verificar en la compilación), gin (última - verificar en la compilación), echo (última - verificar en la compilación), google.golang.org/grpc (última - verificar en la compilación), sigs.k8s.io/controller-runtime (última - verificar en la compilación), kubebuilder (última - verificar en la compilación), tinygo (última - verificar objetivos de placa en la compilación), wazero (última - verificar en la compilación), y golangci-lint (última - verificar conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 19 jul 2026