¿Instalé un paquete con go get y no puedo eliminarlo? Análisis completo

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

«¡Instalé un paquete, pero no puedo eliminarlo!» — ¿Te suena esta historia?

\n\n

Estás empezando a aprender Go, encuentras una biblioteca genial en GitHub, escribes go get github.com/example/package — ¡y todo funciona! Pero pasa el tiempo, el proyecto cambia, y te das cuenta: este paquete ya no es necesario. Buscas el comando go remove o go uninstall, pero... simplemente no existe.

\n\n

Bienvenido al mundo de Go, donde eliminar paquetes no es un botón, sino una pequeña aventura. En este artículo, entenderemos dónde van los paquetes después de go get, cómo «desalojarlos» correctamente y por qué en Go está todo hecho así. Spoiler: después de leerlo, dejarás de temer la basura en el sistema y aprenderás a mantener tus proyectos limpios.

\n\n

Cómo funciona go get: breve introducción

\n\n

Antes de eliminar, entendamos exactamente dónde va el paquete. En Go (antes de la versión 1.16, pero este conocimiento sigue siendo relevante), el comando go get descargaba el código fuente del paquete en dos directorios:

\n\n
    \n
  • $GOPATH/src — el código fuente del paquete (como si hubieras clonado el repositorio);
  • \n
  • $GOPATH/pkg — los archivos objeto compilados (.a).
  • \n
\n\n

Si usas Go modules (y desde la versión 1.16 este es el modo predeterminado), entonces go get funciona de otra manera: añade la dependencia a go.mod y descarga el módulo en la caché ($GOPATH/pkg/mod).

\n\n

El problema es que en Go no hay un comando integrado «eliminar paquete». Los desarrolladores del lenguaje consideran que si ya no necesitas un paquete, simplemente no lo importes en tu código. Suena lógico, pero ¿qué hacer si quieres liberar espacio o poner orden?

\n\n

Método n.º 1: go clean -i (para proyectos antiguos sin módulos)

\n\n

Antes (en la era anterior a los módulos) existía el comando go clean -i. Eliminaba los archivos compilados del paquete de $GOPATH/pkg. Pero no tocaba el código fuente. Es decir, solo eliminabas los artefactos binarios, pero el código permanecía en src.

\n\n
# Eliminamos los archivos compilados del paquete\ngo clean -i github.com/example/package\n\n# El código fuente sigue aquí:\nls $GOPATH/src/github.com/example/package
\n\n

En la práctica, esto era incómodo. Por eso, en las versiones modernas de Go (a partir de la 1.12), go clean -i está obsoleto. Si escribes go clean -i ahora, Go simplemente ignorará la bandera -i y ejecutará un go clean normal (eliminación de archivos objeto en el proyecto actual).

\n\n

Método n.º 2: Eliminación manual desde GOPATH (para veteranos)

\n\n

Si todavía trabajas sin módulos (o simplemente quieres limpiar acumulaciones antiguas), tendrás que hacerlo manualmente. Aquí tienes la receta completa:

\n\n
    \n
  1. Encuentra dónde está tu $GOPATH:
  2. \n
\n\n
go env GOPATH
\n\n

Normalmente es /home/user/go o C:\\Users\\user\\go.

\n\n
    \n
  1. Elimina el código fuente:
  2. \n
\n\n
rm -rf $GOPATH/src/github.com/example/package
\n\n
    \n
  1. Elimina los archivos compilados (si existen):
  2. \n
\n\n
rm -rf $GOPATH/pkg/linux_amd64/github.com/example/package.a
\n\n
\n

Importante: La ruta al archivo .a depende de tu sistema operativo y arquitectura. linux_amd64 es un ejemplo típico. Puedes saber la ruta exacta con go list -m, pero es más sencillo eliminar toda la carpeta del paquete en pkg.

\n
\n\n

Este método funciona, pero es sucio. Corres el riesgo de eliminar algo necesario por accidente. Además, si el paquete se usaba en otros proyectos, estos se romperán.

\n\n

Método n.º 3: Enfoque moderno — go mod tidy

\n\n

Si usas Go modules (y deberías usarlos si empezaste a aprender en 2024), entonces todo es mucho más elegante. Cuando dejas de importar un paquete en tu código, automáticamente deja de ser

Blogs

Book Recommendations