Как установить пакет в Go через go get: команда не работает или устарела?
Всем привет! Я только начал изучать Go, и у меня возникла проблема с установкой сторонних пакетов. Я читал старые статьи, где все просто писали go get github.com/some/package, и пакет сразу скачивался в $GOPATH. Но у меня Go 1.16+, и команда go get ведет себя странно.
Вот что я делаю. У меня есть простой проект в папке /home/user/myproject:
// main.go
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.JSON(200, gin.H{"message": "hello"})
})
r.Run()
}
Я пишу go get github.com/gin-gonic/gin, но в консоли вижу предупреждение:
go: 'go get' is not a standard command. Use 'go install' or 'go run' or 'go build'.
Run 'go help get' for more information.
При этом go mod init myproject я уже сделал, но go mod tidy тоже не добавляет пакет в go.mod. Что я делаю не так? Как сейчас правильно устанавливать пакеты в Go? Почему команда go get больше не работает как раньше? Объясните, пожалуйста, для новичка.
Версия Go: go1.22.2 linux/amd64. Использую модульный режим (инициализировал go mod init).
Заранее спасибо за помощь!
<<Правильное управление зависимостями в современном Go (1.16+)
Привет! Ты столкнулся с типичной проблемой новичков — устаревшей информацией в интернете. Начиная с Go 1.16, поведение go get изменилось: теперь эта команда не устанавливает пакеты глобально, а только обновляет версии зависимостей в go.mod и go.sum. Сама установка пакетов для использования в коде делается через модульную систему.
Вот пошаговое решение для твоего случая с Gin:
Шаг 1. Инициализация модуля (если ещё не сделано)
cd /home/user/myproject
go mod init myproject
Шаг 2. Добавление зависимости в код и её загрузка
Самый простой способ — написать код с импортом нужного пакета, а затем выполнить:
go mod tidy
Эта команда:
- Сканирует все
.goфайлы в проекте - Находит все импортируемые пакеты
- Скачивает их в кэш (
$GOPATH/pkg/mod) - Обновляет
go.modиgo.sum
После выполнения go mod tidy твой go.mod будет выглядеть так:
module myproject
go 1.22
require github.com/gin-gonic/gin v1.9.1
Шаг 3. Сборка проекта
Теперь просто запусти:
go build
# или
go run main.go
Go автоматически подтянет все зависимости из кэша. Ничего руками устанавливать не нужно!
Что делать, если go get всё-таки нужен?
В современном Go go get используется только для:
- Обновления версии конкретной зависимости:
go get github.com/gin-gonic/gin@v1.8.0 - Добавления новой зависимости без изменения кода (редкий кейс):
go get github.com/gin-gonic/gin— но это добавит запись вgo.mod - Важно:
go getбольше не устанавливает исполняемые файлы глобально. Для этого используйgo install.
Пример: установка утилиты (не библиотеки)
Если тебе нужно установить, например, golangci-lint как консольную команду:
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
Бинарник появится в $GOPATH/bin (или $HOME/go/bin).
Почему так изменилось?
Раньше go get смешивал две разные задачи: загрузку библиотек для проекта и установку глобальных утилит. Это приводило к путанице и проблемам с версиями. Начиная с Go 1.16, система стала чище:
- Для библиотек — используй
go mod tidyилиgo get package@version - Для утилит — используй
go install package@version
Твой код с Gin будет работать без каких-либо ручных go get. Просто напиши код, запусти go mod tidy, а затем go build.
Надеюсь, теперь стало понятнее! Если остались вопросы — пиши.
<<Альтернативный подход: использование Go Workspace (Go 1.18+)
Если ты работаешь над несколькими взаимосвязанными модулями (например, микросервисами или библиотеками), можно использовать workspace mode. Это удобно для локальной разработки без публикации пакетов на GitHub.
Создай файл go.work в корневой папке:
go 1.22
use (
./myproject
./myotherlib
)
Теперь, если myproject зависит от myotherlib, которая лежит рядом, Go будет использовать локальную версию, а не загружать её из интернета. Для установки зависимостей в этом режиме всё те же команды:
cd myproject
go mod tidy
go build
Workspace автоматически разрешает зависимости между модулями. Это особенно полезно, когда ты вносишь изменения в библиотеку и тут же тестируешь их в проекте — не нужно каждый раз пушить коммиты.
Команда go get в workspace работает так же: обновляет версии в go.mod для каждого модуля отдельно.
Ответов пока нет.
Войдите чтобы оставить ответ