Los Módulos de Go son el mecanismo estándar de gestión de dependencias, presentado en Go 1.11+. Los archivos principales son go.mod (define las dependencias mínimas y sus versiones) y go.sum (garantiza la integridad a través de hashes).
Para agregar una dependencia se utiliza:
go get github.com/pkg/errors@v0.9.1
Para actualizar las dependencias —
go get -u ./... go mod tidy # eliminar lo no utilizado
Go soporta el versionado semántico (semver), y las dependencias se fijan de manera rígida: el proyecto es reproducible, la compilación es determinista. Pero hay que tener en cuenta:
¿Qué sucederá si se elimina el archivo go.sum y se ejecuta el comando go build, y por qué es peligroso?
Muchos piensan que Go simplemente volverá a construir las dependencias desde cero. Pero el archivo go.sum contiene los hashes de todos los módulos utilizados y protege contra el reemplazo (supply-chain attack). Si se elimina,
la próxima vez que se compile, Go descargará las dependencias de nuevo, recreará el archivo, pero si el repositorio de la dependencia ha sido cambiado por un atacante — ¡la protección se ha roto! Puede haber un reemplazo de código en producción.
Historia
En un gran proyecto, el repositorio cambió de vendoring a módulos de Go, olvidaron fijar las versiones. Después de un mes, las actualizaciones de paquetes externos rompieron la compatibilidad, se volvió imposible compilar la rama antigua — el código perdió su reproducibilidad.
Historia
En otro proyecto, un desarrollador eliminó accidentalmente go.sum. Tras reiniciar, el equipo notó que algunas dependencias cambiaron, aparecieron errores relacionados con la incompatibilidad de versiones menores — como resultado, hubo un retroceso de varios días.
Historia
El uso de rutas de reemplazo en directorios locales (replace ... = ../some/library) no se eliminó antes de la implementación — en el pipeline de CI/CD la construcción falló, ya que el sistema externo no tenía acceso a los archivos locales, y la producción resultó "bloqueada" en una versión incorrecta.