¿Por qué "go get" se rompió y cómo solucionarlo?
\nSi alguna vez te has preguntado "How can I install a package with go get?" — no estás solo. Esta pregunta ha acumulado miles de visitas en Stack Overflow, y con razón. Antes todo era simple: go get github.com/some/package — y la biblioteca estaba en tu $GOPATH/src. Pero después del lanzamiento de Go 1.16, todo cambió. Ahora go get ya no instala paquetes en el sentido tradicional. En su lugar, solo actualiza go.mod. Y para instalar binarios, apareció el comando go install.
En este artículo, entenderemos qué sucedió, cómo instalar correctamente paquetes y dependencias ahora, y por qué los principiantes se confunden tan a menudo. ¡Allá vamos!
\n\nBreve historia: de GOPATH a los módulos
\nAntes de la versión Go 1.11, todo el código vivía en GOPATH — una carpeta especial donde se almacenaban todos tus proyectos y paquetes de terceros. El comando go get descargaba las fuentes directamente allí. Era conveniente, pero generaba problemas con las versiones: si dos proyectos requerían versiones diferentes de la misma biblioteca, comenzaba el caos.
Con la llegada de los módulos Go (desde Go 1.11 y de forma estable desde 1.16), cada proyecto obtuvo su propio go.mod — un archivo donde se especifican las dependencias y sus versiones. Ahora go get funciona de manera diferente:
- \n
- Agrega la dependencia a
go.mod\n - Descarga en caché (generalmente en
$GOPATH/pkg/mod) \n - No crea un binario en
$GOPATH/bin\n
Si necesitas instalar un programa ya compilado (por ejemplo, una utilidad de línea de comandos) — usa go install.
Cómo funciona go get ahora: análisis paso a paso
\nAbre la terminal y crea un nuevo módulo:
\nmkdir myproject\ncd myproject\ngo mod init myproject\nAhora queremos agregar, por ejemplo, la popular biblioteca gorilla/mux para enrutamiento. Antes habríamos escrito:
go get github.com/gorilla/mux\nY esto funcionará — la biblioteca se descargará. Pero observa lo que sucedió:
\n- \n
- En
go.modapareció la línea:require github.com/gorilla/mux v1.8.0\n - En la carpeta del proyecto apareció
go.sum— un archivo con sumas de verificación para seguridad \n - Los fuentes de la biblioteca están en caché, no junto al proyecto \n
Ahora en tu código puedes importar el paquete:
\npackage main\n\nimport (\n "fmt"\n "github.com/gorilla/mux"\n)\n\nfunc main() {\n r := mux.NewRouter()\n fmt.Println("Router created!")\n}\nEjecuta go run main.go — todo funciona. Pero si querías obtener un binario (programa compilado) — go get no te lo dará.
Instalación de binarios: go install al rescate
\nSupongamos que encontraste una utilidad genial en Go, por ejemplo golangci-lint — un linter para código. Para instalarla como comando en el sistema, antes escribías:
go get github.com/golangci/golangci-lint/cmd/golangci-lint\nAhora esto no funcionará (mostrará una advertencia). La forma correcta es:
\ngo install github.com/golangci/golangci-lint/cmd/golangci-lint@latest\n¿Qué sucederá?
\n- \n
- Go descargará los fuentes de la utilidad \n
- Los compilará \n
- Colocará el binario resultante en
$GOPATH/bin(o$GOBIN, si la variable está definida) \n
Asegúrate de que $GOPATH/bin esté agregado al PATH — de lo contrario, el comando no estará disponible. Puedes verificarlo así:
echo $GOPATH\n# normalmente /home/usuario/go\nls ~/go/bin/\nSi tu binario está allí — todo bien.
\n\nErrores típicos de principiantes (y cómo evitarlos)
\nEn Stack Overflow, las preguntas más frecuentes son sobre estos problemas:
\n- \n
- "go get no crea la carpeta src"
Blogs
Book Recommendations
Leer también
Seguridad de aplicaciones C++: top 10 vulnerabilidades en la práctica
Swift habla todos los idiomas: guía de integración con Python, C y más
Patrón Builder en Kotlin: guía paso a paso con código
Inyección de Dependencias en C#: guía sencilla para principiantes
Despliegue de C++ en Kubernetes: guía básica