La gestión de dependencias en Go ha evolucionado mucho en los últimos años. Antes de Go modules, las dependencias se descargaban directamente desde los sistemas de control de versiones (GitHub, Bitbucket, Mercurial, SVN). Esto traía problemas recurrentes:
- Los autores podían borrar o modificar versiones sin previo aviso.
- Los builds no siempre eran reproducibles.
Con la llegada de GOPROXY, estos problemas se redujeron de forma significativa.
Pero, ¿Qué es un GOPROXY?
Un GOPROXY es un proxy de módulos de Go que define de dónde se descargan las dependencias. Sus objetivos principales son:
- Determinismo: garantizar que siempre obtengas la misma versión del código.
- Seguridad y disponibilidad: mantener accesibles las dependencias incluso si el repositorio original desaparece.
En realidad, un GOPROXY no es magia; es simplemente un servidor HTTP con endpoints bien definidos que asegura determinismo, seguridad y un fallback controlado en la resolución de dependencias.
Estrategias para usar GOPROXY
1. Usar un GOPROXY público
Los GOPROXY públicos (ej. proxy.golang.org) son gratuitos y accesibles globalmente.
Ventajas:
- Descargas más rápidas que desde el sistema de control de versiones.
- Integración con pkg.go.dev para explorar módulos.
Limitaciones:
- Solo funciona con módulos públicos.
- No gestiona dependencias privadas.
2. Combinar público + privado con GOPRIVATE
Si trabajas en proyectos de código abierto y a la vez con dependencias internas, puedes configurar la variable de entorno GOPRIVATE para excluir ciertos paths del proxy público.
Esto permite:
- Resolver dependencias privadas directamente desde su origen.
- Seguir usando el GOPROXY para módulos públicos.
Ejemplo de configuración:
go env -w GOPRIVATE=github.com/electrocucaracha/*
3. Desplegar tu propio GOPROXY privado
La opción más robusta es montar tu propio GOPROXY privado en tu infraestructura. Lo cual ofrece:
- Cachea módulos públicos desde proxy.golang.org.
- Gestiona módulos privados desde tus repositorios internos.
- Expone un único punto de acceso mediante un repositorio virtual.
Esto te da control total sobre disponibilidad, seguridad y auditoría de dependencias.
Conclusión
Si quieres builds determinísticos, rápidos y seguros en Go, usa GOPROXY:
- Para proyectos simples, un proxy público es suficiente.
- Para entornos mixtos, combina GOPROXY + GOPRIVATE.
- Para máxima robustez, despliega un GOPROXY privado.
Con esta práctica evitas dolores de cabeza con dependencias y aseguras la calidad de tus builds.