Domando go get: instalación de paquetes en Go para principiantes

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Por qué "go get" se rompió y cómo solucionarlo?

\n

Si 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.

\n

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\n

Breve historia: de GOPATH a los módulos

\n

Antes 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.

\n

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
    \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
\n

Si necesitas instalar un programa ya compilado (por ejemplo, una utilidad de línea de comandos) — usa go install.

\n\n

Cómo funciona go get ahora: análisis paso a paso

\n

Abre la terminal y crea un nuevo módulo:

\n
mkdir myproject\ncd myproject\ngo mod init myproject
\n

Ahora queremos agregar, por ejemplo, la popular biblioteca gorilla/mux para enrutamiento. Antes habríamos escrito:

\n
go get github.com/gorilla/mux
\n

Y esto funcionará — la biblioteca se descargará. Pero observa lo que sucedió:

\n
    \n
  1. En go.mod apareció la línea: require github.com/gorilla/mux v1.8.0
  2. \n
  3. En la carpeta del proyecto apareció go.sum — un archivo con sumas de verificación para seguridad
  4. \n
  5. Los fuentes de la biblioteca están en caché, no junto al proyecto
  6. \n
\n

Ahora en tu código puedes importar el paquete:

\n
package main\n\nimport (\n    "fmt"\n    "github.com/gorilla/mux"\n)\n\nfunc main() {\n    r := mux.NewRouter()\n    fmt.Println("Router created!")\n}
\n

Ejecuta go run main.go — todo funciona. Pero si querías obtener un binario (programa compilado) — go get no te lo dará.

\n\n

Instalación de binarios: go install al rescate

\n

Supongamos 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:

\n
go get github.com/golangci/golangci-lint/cmd/golangci-lint
\n

Ahora esto no funcionará (mostrará una advertencia). La forma correcta es:

\n
go 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
\n

Asegúrate de que $GOPATH/bin esté agregado al PATH — de lo contrario, el comando no estará disponible. Puedes verificarlo así:

\n
echo $GOPATH\n# normalmente /home/usuario/go\nls ~/go/bin/
\n

Si tu binario está allí — todo bien.

\n\n

Errores típicos de principiantes (y cómo evitarlos)

\n

En Stack Overflow, las preguntas más frecuentes son sobre estos problemas:

\n