Avatar ·

Как установить пакет в 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 для каждого модуля отдельно.