Avatar ·

Как правильно удалить пакеты, установленные через go get?

Всем привет! Я только начал изучать Go и столкнулся с непонятной ситуацией. Я установил несколько пакетов через `go get`, например: ```go go get github.com/gin-gonic/gin go get github.com/jinzhu/gorm ``` Теперь я понял, что мне не нужен GORM, и хочу его удалить. Но я не могу найти команду `go remove` или `go uninstall`. В документации написано что-то про `go clean`, но это не то же самое. В GOPATH у меня есть папка `src/github.com/jinzhu/gorm`, и я могу просто удалить её вручную. Но это кажется неправильным — что если пакет имеет зависимости? Они тоже останутся висеть мёртвым грузом. Я также пробовал удалить запись из `go.mod`, но после этого `go build` всё равно находит пакет. Мой `go.mod` выглядит так: ``` module myproject go 1.21 require ( github.com/gin-gonic/gin v1.9.1 github.com/jinzhu/gorm v1.9.16 ) ``` Я пробовал удалить строку с GORM и запустить `go mod tidy`, но это не помогло — пакет всё ещё импортится в коде. Подскажите, как правильно удалить пакет, установленный через `go get`, чтобы и из кода, и из модуля он исчез? И как вообще работает управление зависимостями в Go? Заранее спасибо! <<>>

Правильный способ удаления пакетов в Go (модульный режим)

Вы столкнулись с типичной путаницей начинающих Go-разработчиков. В Go нет команды go remove или go uninstall, потому что управление зависимостями работает иначе, чем в npm или pip. Давайте разберёмся по порядку.

Начиная с Go 1.11, основной способ управления зависимостями — это модули (go modules). Если ваш проект использует go.mod (а вы показали, что используете), то вы работаете именно в модульном режиме. В этом случае удаление пакета — это двухэтапный процесс:

  1. Удалить все импорты пакета из исходного кода.
  2. Запустить go mod tidy.

Пошаговая инструкция

Шаг 1. Откройте все файлы в вашем проекте и удалите строки вида:

import (
    "github.com/jinzhu/gorm"
)

Если пакет используется в коде (например, db, _ := gorm.Open(...)), замените эту логику на что-то другое или удалите целиком. Компилятор Go не позволит удалить зависимость, пока на неё есть ссылки.

Шаг 2. После того как вы убрали все импорты, выполните в терминале в корне проекта:

go mod tidy

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

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

Проверка. После выполнения go mod tidy ваш go.mod должен выглядеть так:

module myproject

go 1.21

require (
    github.com/gin-gonic/gin v1.9.1
)

А файл go.sum тоже обновится — из него исчезнут хеши удалённого пакета.

Что делать, если пакет всё ещё "висит"?

Бывает, что go mod tidy не срабатывает, потому что:

  • Вы случайно оставили импорт в каком-то файле (проверьте через grep -r "gorm" .).
  • Пакет используется транзитивно (через другую зависимость). В этом случае go mod tidy оставит его, но пометит как // indirect. Если вам нужно избавиться и от него — придётся удалить родительский пакет.
  • Вы работаете в старом режиме GOPATH (без go.mod). Тогда да, нужно просто удалить папку из src/ вручную.

Важное замечание про кэш

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

go clean -modcache

Но это удалит кэш всех пакетов, и при следующей сборке их придётся скачивать заново.

Итог

Запомните главное правило: не трогайте папки вручную, используйте go mod tidy. Это официальный и единственно правильный способ "удаления" пакетов в современном Go. Если вы работаете с go.mod, то физическое расположение файлов в pkg/mod вас не должно волновать — Go сам управляет этим.

<<>>

Альтернативный подход: ручная очистка для старых проектов (GOPATH mode)

Если вы всё ещё используете старый режим GOPATH (без go.mod), то ваш единственный вариант — ручное удаление. В этом случае пакеты устанавливаются прямо в $GOPATH/src, и никакой автоматической очистки нет.

Чтобы удалить пакет вручную:

  1. Найдите его расположение: echo $GOPATH (обычно ~/go).
  2. Удалите папку пакета: rm -rf $GOPATH/src/github.com/jinzhu/gorm.
  3. Если у пакета есть зависимости, они тоже лежат в src/ — их можно удалить аналогично, но будьте осторожны: другие пакеты могут их использовать.
  4. Очистите кэш сборки: go clean -i -x github.com/jinzhu/gorm (удалит скомпилированные объектные файлы).

Недостатки ручного метода:

  • Легко оставить "осиротевшие" зависимости, которые занимают место.
  • Нет гарантии, что вы удалили все следы — пакет мог быть собран в pkg/.
  • Рекомендую мигрировать на модули (создать go.mod через go mod init), это избавит вас от ручной возни.