Установил пакет через go get, а удалить не могу? Полный разбор

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

«Я установил пакет, но не могу его удалить!» — знакомая история?

Вы только начинаете изучать Go, находите крутую библиотеку на GitHub, пишете go get github.com/example/package — и всё работает! Но проходит время, проект меняется, и вы понимаете: этот пакет больше не нужен. Вы ищете команду go remove или go uninstall, но... её просто нет.

Добро пожаловать в мир Go, где удаление пакетов — это не кнопка, а маленькое приключение. В этой статье мы разберёмся, куда попадают пакеты после go get, как их правильно «выселять» и почему в Go всё сделано именно так. Спойлер: после прочтения вы перестанете бояться мусора в системе и научитесь держать свои проекты в чистоте.

Как работает go get: краткий ликбез

Прежде чем удалять, давайте поймём, куда именно попадает пакет. В Go (до версии 1.16, но это знание всё ещё актуально) команда go get скачивала исходный код пакета в две директории:

  • $GOPATH/src — исходники пакета (как если бы вы склонировали репозиторий);
  • $GOPATH/pkg — скомпилированные объектные файлы (.a).

Если вы используете Go modules (а с версии 1.16 это режим по умолчанию), то go get работает иначе: он добавляет зависимость в go.mod и скачивает модуль в кеш ($GOPATH/pkg/mod).

Проблема в том, что в Go нет встроенной команды «удалить пакет». Разработчики языка считают, что если пакет вам больше не нужен — просто не импортируйте его в коде. Звучит логично, но что делать, если хочется освободить место или навести порядок?

Способ №1: go clean -i (для старых проектов без модулей)

Раньше (до эры модулей) существовала команда go clean -i. Она удаляла скомпилированные файлы пакета из $GOPATH/pkg. Но исходники она не трогала. То есть вы удаляли только бинарные артефакты, но сам код оставался в src.

# Удаляем скомпилированные файлы пакета
go clean -i github.com/example/package

# Исходники всё ещё здесь:
ls $GOPATH/src/github.com/example/package

На практике это было неудобно. Поэтому в современных версиях Go (начиная с 1.12) go clean -i объявлен устаревшим. Если вы пишете go clean -i сейчас, Go просто проигнорирует флаг -i и выполнит обычный go clean (удаление объектных файлов в текущем проекте).

Способ №2: Ручное удаление из GOPATH (для ветеранов)

Если вы всё ещё работаете без модулей (или просто хотите почистить старые залежи), придётся действовать руками. Вот полный рецепт:

  1. Найдите, где находится ваш $GOPATH:
go env GOPATH

Обычно это /home/user/go или C:\Users\user\go.

  1. Удалите исходники:
rm -rf $GOPATH/src/github.com/example/package
  1. Удалите скомпилированные файлы (если они есть):
rm -rf $GOPATH/pkg/linux_amd64/github.com/example/package.a

Важно: Путь к .a файлу зависит от вашей ОС и архитектуры. linux_amd64 — это типичный пример. Узнать точный путь можно через go list -m, но проще просто удалить всю папку пакета в pkg.

Этот метод работает, но он грязный. Вы рискуете случайно удалить что-то нужное. Плюс, если пакет использовался в других проектах — они сломаются.

Способ №3: Современный подход — go mod tidy

Если вы используете Go modules (а вы должны их использовать, если начали изучение в 2024 году), то всё гораздо элегантнее. Когда вы перестаёте импортировать пакет в своём коде, он автоматически перестаёт быть нужным. Но в go.mod и кеше он всё ещё числится.

Чтобы полностью очистить проект от мёртвых зависимостей, выполните:

go mod tidy

Эта команда делает две вещи:

  • Удаляет из go.mod все зависимости, которые не используются ни в одном .go файле проекта;
  • Удаляет из локального кеша ($GOPATH/pkg/mod) версии модулей, на которые больше никто не ссылается.

Пример: Вы установили github.com/gin-gonic/gin, поигрались, но потом перешли на github.com/labstack/echo. В коде остался только echo. Запускаете:

go mod tidy

Go смотрит: «Ага, gin больше не импортируется. Удаляем его из go.mod и из кеша». Вуаля — чистота!

Но есть нюанс: go mod tidy работает только в контексте текущего проекта. Если вы хотите удалить пакет глобально (чтобы он не висел в кеше вообще), читайте дальше.

Способ №4: Очистка глобального кеша Go

Иногда пакеты остаются в общем кеше модулей ($GOPATH/pkg/mod/cache). Это нормально: Go хранит там скачанные версии, чтобы не качать их заново для каждого проекта. Но если вы хотите освободить место, можно почистить кеш целиком:

go clean -modcache

Эта команда удалит все скачанные модули из кеша. При следующей сборке проектов Go скачает их заново. Удобно, если вы случайно накачали гигабайты мусора.

Внимание: После go clean -modcache ваши проекты не сломаются, но при первой сборке придётся подождать, пока Go заново скачает зависимости. Если у вас медленный интернет — лучше не злоупотреблять.

Альтернатива для точечного удаления: если вы знаете точное имя модуля, можно удалить его вручную из кеша:

rm -rf $(go env GOPATH                

Блоги

Рекомендаций по книгам