«Я установил пакет, но не могу его удалить!» — знакомая история?
Вы только начинаете изучать 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 (для ветеранов)
Если вы всё ещё работаете без модулей (или просто хотите почистить старые залежи), придётся действовать руками. Вот полный рецепт:
- Найдите, где находится ваш
$GOPATH:
go env GOPATH
Обычно это /home/user/go или C:\Users\user\go.
- Удалите исходники:
rm -rf $GOPATH/src/github.com/example/package
- Удалите скомпилированные файлы (если они есть):
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