title: "Mejores Prácticas para la Cadena de Herramientas de Go" section: go-toolchain order: 9 tags:
- "go"
- "go-toolchain"
- "best-practices"
- "list"
- "toolchain" level: basic description: "Aprenda las mejores prácticas de la cadena de herramientas de Go para compilaciones reproducibles, integración de CI y fijación de la cadena de herramientas. Mantenga los flujos de trabajo del comando go consistentes." highlights:
- "Fije la versión de Go en go.mod para que los compañeros de equipo y la CI utilicen el mismo compilador"
- "Ejecute go mod tidy después de los cambios para mantener las líneas de require mínimas y precisas"
- "Confirme go.sum con go.mod para que las sumas de verificación verifiquen compilaciones reproducibles"
- "Establezca GOPRIVATE para módulos internos para evitar filtrar rutas privadas"
- "Envíe artefactos de go build a producción, no go run, para evitar recompilaciones"
- "Use -trimpath y -ldflags para reducir los binarios de lanzamiento" updated: "2026-07-19"
Mejores Prácticas para la Cadena de Herramientas de Go
Compilaciones reproducibles, integración de CI y fijación de la cadena de herramientas.
Estas reglas mantienen los flujos de trabajo del comando go consistentes, desde los portátiles hasta la CI y los artefactos de lanzamiento.
Cómo Usar Esta Lista
- Aplique durante la revisión de PR cuando cambien los comandos de dependencia, compilación o prueba.
- Refleje los mismos valores de
GOPRIVATE,GOPROXYyGOTOOLCHAINen la CI y en la documentación para desarrolladores. - Ejecute
go mod tidy,go test ./...y linters en cada aumento de dependencia antes de fusionar. - Vuelva a revisar después de las actualizaciones menores de Go; los modernizadores y los analizadores
vetse expanden en cada lanzamiento.
A - Higiene de la cadena de herramientas y módulos
- Fije la versión de Go en
go.mody documente la política deGOTOOLCHAIN. Los compañeros de equipo y la CI deben resolver el mismo compilador; useautosolo cuando acepte descargas automáticas. - Ejecute
go mod tidydespués de cualquier cambio de importación o dependencia. Mantiene las líneasrequiremínimas ygo.sumprecisas. - Confirme
go.sumsiempre que cambiego.mod. Las sumas de verificación son parte del contrato de compilación reproducible. - Establezca
GOPRIVATEpara cada prefijo de módulo interno. Evita filtrar rutas privadas al proxy público y a la base de datos de sumas. - Coloque un proxy interno (Athens/Artifactory) delante de
proxy.golang.org. Acelera la CI y sobrevive a las interrupciones externas.
B - Comandos de compilación y lanzamiento
- Envíe artefactos de
go build, nogo run, en producción.runrecompila en cada invocación y oculta la ruta del binario. - Use
-trimpathy-ldflags="-s -w"para los binarios de lanzamiento. Reduce el tamaño y elimina las rutas del host de las pilas. - Nombra las salidas explícitamente con
-o bin/<nombre>. Evita colisiones al compilar múltiples comandos en un solo paso de canalización. - Compile cruzado con
CGO_ENABLED=0a menos que realmente necesite cgo. Las matrices de Go puras son más simples en un constructor de Linux. - Registre
go versionygo enven los registros de lanzamiento. Acelera la depuración cuando la CI y las compilaciones del portátil divergen.
C - Puertas de prueba, verificación y lintado
- Ejecute
go test ./...(o./...con-raceen CI) en cada PR. La puerta predeterminada antes de fusionar. - Ejecute
go vet ./...antes de los linters opcionales. Línea de base de configuración cero de la biblioteca estándar. - Ejecute
golangci-lint(o staticcheck) con una configuración confirmada. Reglas de todo el equipo más allá devet. - Use
go test -count=1mientras depura fallos intermitentes; corrija la causa raíz antes de fusionar. No confíe en la caché de pruebas deshabilitada en la CI de producción para siempre. - Ejecute
go fix -diffdespués de las actualizaciones de Go, luego aplique con revisión. Los modernizadores detectan modismos que los datos de entrenamiento pueden pasar por alto.
D - Caché, vendor y CI hermética
- Caché
GOMODCACHEyGOCACHEen CI. Los pasos de calentamiento dego mod downloadvalen la pena en cada trabajo. - Use
-mod=readonlyen CI cuando no esté usando vendor. Falla las compilaciones que modificango.modsilenciosamente. - Vuelva a hacer vendor en el mismo commit que los aumentos de dependencia cuando use
vendor/. La deriva rompe las canalizaciones de-mod=vendor. - Evite
go clean -modcacheen la CI de rutina. Solo borre las cachés cuando se demuestre corrupción. - Verifique la autenticación de módulos privados en CI con una ejecución de prueba
go mod download. Detecte la expiración del token antes de los pasos de compilación.
E - Generación de código y etiquetas
- Fije las versiones del generador en las directivas
//go:generate.go run tool@versionsupera a los binarios locales indocumentados. - Falle la CI en la deriva de
go generate(git diff --exit-code). La salida generada se mantiene sincronizada con las fuentes. - Documente los
-tagsrequeridos para las compilaciones de producción. La pruebago testpredeterminada puede omitir archivos etiquetados que la CI nunca ejercita. - Pruebe en matriz las combinaciones de etiquetas críticas. Al menos los conjuntos de etiquetas predeterminados y de producción.
- Mantenga las etiquetas de compilación para los backends en tiempo de compilación, no para los toggles de funciones de operaciones. La configuración en tiempo de ejecución evita la rotación de reconstrucción.
Preguntas Frecuentes
¿Cuál es la canalización mínima de CI para Go?
go mod download, go test ./..., go vet ./..., y opcionalmente golangci-lint run.
Agregue -race cuando los ejecutores tengan suficiente CPU y RAM.
¿Debería usar vendor?
Use vendor cuando la política requiera código fuente de terceros en el repositorio o las compilaciones no deban llegar a los proxies de módulos.
De lo contrario, prefiera el proxy más la GOMODCACHE cacheada.
¿Cómo fijo las versiones de parche?
Establezca go 1.26.x en go.mod y GOTOOLCHAIN=go1.26.x en CI.
Permita la descarga automática de parches solo si el equipo está de acuerdo.
¿Cuándo deben ejecutarse los modernizadores?
Durante las ramas de actualización, localmente con go fix -diff, luego confirme los cambios revisados.
No en cada PR no relacionado.
¿Cómo interactúan los módulos privados y Athens?
Athens almacena en caché las descargas dentro de su red.
GOPRIVATE todavía marca qué rutas nunca deben llegar al índice público.
¿Deberían las pruebas de integración usar etiquetas?
Sí.
Mantenga las suites de integración lentas detrás de las etiquetas integration y ejecútelas por la noche o en la rama principal.
¿Qué variables de entorno pertenecen a la documentación del repositorio?
GOPRIVATE, GOPROXY, GONOSUMDB, GOTOOLCHAIN, y cualquier configuración de autenticación para hosts de Git.
No secretos en sí mismos: haga referencia al almacén de secretos.
¿Cómo acelero `go test` en CI?
Caché GOCACHE, divida -race a un trabajo dedicado y use -shuffle=on solo al buscar errores de orden.
Evite -a a menos que depure problemas de caché.
¿Sigue siendo necesario `gofmt`?
Sí.
Aplíquelo con gofmt -l o los linters gofmt/goimports de golangci-lint en CI.
¿Qué deben incluir los artefactos de lanzamiento?
Binario por objetivo, cadena go version incrustada a través de -ldflags, y entrada SBOM de go list -m -json all.
Relacionado
- El Comando go: Ciclo de Vida de Compilación, Prueba y Módulos - descripción general conceptual
- Conceptos Básicos de la Cadena de Herramientas de Go - ejemplos de comandos
- go build, run, install & clean - flags de lanzamiento
- go mod tidy, vendor, download & graph - flujos de trabajo de dependencias
- Compilación Cruzada y Proxies de Módulos Privados - configuración de variables de entorno
Versiones de pila: Esta página fue escrita para Go 1.26.x (predeterminado Green Tea GC, modernizadores de
go fix- verifique el parche en la compilación), chi (última - verifique en la compilación), gin (última - verifique en la compilación), echo (última - verifique en la compilación), google.golang.org/grpc (última - verifique en la compilación), sigs.k8s.io/controller-runtime (última - verifique en la compilación), kubebuilder (última - verifique en la compilación), tinygo (última - verifique los objetivos de placa en la compilación), wazero (última - verifique en la compilación) y golangci-lint (última - verifique el conjunto de linters en la compilación).