go.mod, go.sum y Selección de Versión Mínima
go.mod declara tu módulo y sus dependencias; go.sum bloquea sus checksums.
Busca en todas las páginas de la documentación
go.mod declara tu módulo y sus dependencias; go.sum bloquea sus checksums.
Juntos proporcionan builds reproducibles, y la Selección de Versión Mínima (MVS) elige versiones compatibles sin el comportamiento arbitrario de "el más nuevo gana".
go.mod es el contrato de dependencias autoritativo para un módulo.
go.sum registra los hashes h1 de los archivos de módulos y go.mod que la toolchain ha visto.
MVS lee cada requisito en el grafo y selecciona la mínima versión semver que aún los satisface a todos.
Entender estas tres piezas explica la mayoría de las preguntas sobre go get, deriva de CI y "¿por qué está esta versión aquí?".
Tarjeta de referencia rápida - lista para copiar y pegar.
go mod init example.com/app
go get github.com/stretchr/testify@v1.9.0
go mod tidy
go list -m all// go.mod (después de tidy)
module example.com/app
go 1.26
require (
github.com/stretchr/testify v1.9.0
)Cuándo usar esto:
require no utilizadas después de una refactorización (go mod tidy).example.com/app/
go.mod
go.sum
main.go
// main.go
package main
import (
"fmt"
"github.com/google/uuid"
)
func main() {
fmt.Println(uuid.NewString())
}go get github.com/google/uuid@v1.6.0
go mod tidy
cat go.mod
grep uuid go.sumLo que esto demuestra:
require registra las dependencias directas que importas (y a veces herramientas).go.sum gana líneas como github.com/google/uuid v1.6.0 h1:... para verificación de contenido.go list -m all muestra los módulos directos y transitivos en la lista de compilación.go get).go carga los archivos go.mod de tu módulo y dependencias recursivamente.require.go.sum; las líneas faltantes pueden añadirse en la primera obtención de confianza.MVS no es un solucionador global que minimiza las actualizaciones totales.
Es local por ruta de módulo: elige la versión más antigua que aún cumpla todos los mínimos declarados.
| Directiva | Propósito |
|---|---|
module | Prefijo de ruta de importación para este módulo |
go | Versión mínima de la toolchain/lenguaje Go |
require | Ruta de módulo → semver (o pseudo-versión) |
exclude | Prevenir la selección de una versión específica defectuosa |
replace | Sobrescribir fuente o versión (ruta local, fork) |
retract | Marcar tus propias versiones defectuosas (en el go.mod de tu módulo) |
Las dependencias indirectas aparecen con comentarios // indirect después de go mod tidy cuando no las importas directamente.
Cada versión de módulo típicamente tiene:
github.com/foo/bar v1.2.3 h1:<hash>
github.com/foo/bar v1.2.3/go.mod h1:<hash>
La línea /go.mod hashea el archivo go.mod de la dependencia.
Haz commit de go.sum para aplicaciones y librerías para que la CI verifique el mismo contenido.
Si el módulo A requiere C v1.2.0 y el módulo B requiere C v1.4.0, MVS selecciona C v1.4.0 (la mínima que satisface el requisito más alto).
Si ambos requirieran v1.2.0, obtendrías v1.2.0 incluso cuando v1.9.0 exista en el proxy.
# Ver por qué aparece un módulo
go mod why -m github.com/some/transitive
# Grafo de requisitos
go mod graph | head
# Verificar sumas sin red cuando sea posible
go mod verify// directiva de toolchain (opcional, Go 1.21+)
// go.mod
module example.com/app
go 1.26
toolchain go1.26.0go.mod manualmente sin go mod tidy deja 'requires' huérfanos. Prefiere comandos que actualicen tanto go.mod como go.sum.go get -u siempre ayuda puede introducir actualizaciones amplias; revisa las diferencias y ejecuta pruebas.go.sum para "arreglar" errores elimina el rastro de auditoría; regenera con tidy y get intencionales en su lugar.// indirect no significa no utilizado - significa que ningún paquete en tu módulo lo importa directamente; aún podrías necesitarlo transitivamente.GOPRIVATE y credenciales VCS - la base de datos de checksums puede omitirse para rutas privadas.go mod vendor) - Copia el código fuente a vendor/ para CI offline o hermética.go.work) - Sobrescribe locales sin hacer commit de replace en cada módulo.go get module@v en CI - Actualizaciones programadas en lugar de usar @latest flotante en main.Un algoritmo que elige, para cada ruta de módulo, la versión semver más baja que satisface todas las directivas require en el grafo combinado.
No para proyectos en equipo.
Ignóralo solo en experimentos desechables; los repositorios de producción lo incluyen en el commit.
Una dependencia directa importa otro módulo que tú no importas directamente.
Tidy lo registra para que las compilaciones sigan siendo reproducibles.
Verifica los árboles de módulos en caché y los checksums contra go.sum.
Ejecútalo en CI para detectar corrupción de caché o manipulación.
Ejecuta go get github.com/foo/bar@v1.1.0, luego prueba y haz commit de la diferencia en go.mod/go.sum.
Solo cuando se requieren explícitamente o cuando ninguna versión estable satisface las restricciones.
Prefiere etiquetas estables para producción.
Un registro público (sum.golang.org) que refleja los hashes de módulos para módulos abiertos.
Los módulos privados establecen GOPRIVATE para omitirla.
La compilación de tu módulo fusiona el grafo; MVS resuelve a versiones compatibles o falla con un error durante la carga.
Las características del lenguaje y el comportamiento de la toolchain disponibles al compilar este módulo.
No es una dependencia en tiempo de ejecución como solo los motores de npm.
Después de fusiones que toquen importaciones, antes de las etiquetas de lanzamiento y en CI en cada PR.
Versiones de Stack: Esta página fue escrita para Go 1.26.x (Green Tea GC por defecto, go fix modernizadores - 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: 18 jul 2026