Avatar ·

Что делает команда go install и как ей правильно пользоваться?

Всем привет! Я только начал изучать Go и пытаюсь разобраться с инструментами сборки. Прочитал документацию, но всё равно путаюсь.

Я написал простую программу — HTTP-сервер, который лежит в папке ~/projects/myapp/main.go. Когда я запускаю go build, он создаёт бинарник прямо в текущей папке. Но я слышал, что есть ещё команда go install. Я попробовал её выполнить, и она тоже что-то скомпилировала, но я не нашёл бинарник в папке проекта. При этом в консоли не было никаких ошибок. Куда он делся?

Вот мой код:

package main

import (
    "fmt"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello, World!")
    })
    http.ListenAndServe(":8080", nil)
}

Я выполняю:

cd ~/projects/myapp
go install

После этого в папке myapp не появляется никаких новых файлов. Я проверил echo $GOPATH — там написано /home/user/go. Может быть, бинарник попал туда? И вообще, в чём разница между go build и go install? Когда какую команду использовать? Заранее спасибо за объяснение!

<<>>

Что делает go install на самом деле

Отличный вопрос! Вы почти догадались — бинарник действительно попадает в $GOPATH/bin (или $HOME/go/bin, если GOPATH не задан явно). Давайте разберёмся подробно.

Разница между go build и go install

  • go build — компилирует пакет и создаёт исполняемый файл прямо в текущей директории. Для пакета main (как в вашем примере) он создаёт бинарник с именем папки проекта.
  • go install — делает то же самое, но затем перемещает готовый бинарник в $GOPATH/bin (или $GOBIN, если эта переменная установлена). В текущей папке бинарник не остаётся.

Проверяем, куда попал ваш бинарник

Выполните в терминале:

ls -la $(go env GOPATH)/bin/myapp

Если файл там — всё работает правильно. Также можно проверить переменные окружения:

go env GOPATH
go env GOBIN

Если GOBIN пустая, используется $GOPATH/bin.

Как сделать бинарник доступным глобально

Добавьте $GOPATH/bin в переменную PATH. Пропишите в ~/.bashrc или ~/.zshrc:

export PATH=$PATH:$(go env GOPATH)/bin

После перезапуска терминала вы сможете запускать вашу программу просто командой myapp из любой папки.

Когда использовать каждую команду

  • go build — для быстрой проверки, что код компилируется, или когда вам нужен бинарник прямо в папке проекта (например, для деплоя).
  • go install — когда вы разрабатываете утилиту командной строки и хотите установить её в систему для повседневного использования. Также go install используется для установки сторонних инструментов, например: go install github.com/gin-gonic/gin@latest.

Дополнительный совет: go install с версией

В современных версиях Go (1.16+) можно указывать конкретную версию пакета:

go install golang.org/x/tools/gopls@latest
go install github.com/go-delve/delve/cmd/dlv@v1.20.0

Это устанавливает бинарник в $GOPATH/bin без необходимости клонировать репозиторий.

Проверка успешной установки

После go install можно проверить, что бинарник работает, запустив его из любой папки (если $GOPATH/bin в PATH):

myapp
# Сервер запустится на порту 8080

Или явно указать путь:

$(go env GOPATH)/bin/myapp

Надеюсь, теперь стало понятнее! go install — это просто go build + установка в глобальный каталог.

<<>>

Альтернативный взгляд: go install как менеджер инструментов

Первый ответ всё правильно объяснил, но я хочу добавить важный контекст: в современном Go (начиная с версии 1.16) go install стал основным способом установки сторонних утилит, а не только ваших собственных проектов.

Примеры использования

Если вы хотите установить, например, линтер golangci-lint, вы делаете:

go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest

Обратите внимание на @latest — это указание версии. Без него команда может не сработать в новых версиях Go.

Когда НЕ стоит использовать go install

  • Если вы разрабатываете библиотеку (не main-пакет) — go install просто скомпилирует её и положит в кэш, но бинарника не создаст.
  • Если вам нужно быстро протестировать изменения — проще использовать go run main.go, который компилирует и запускает без создания файла.

Полезная команда для отладки

go list -f '{{.Target}}'

Она покажет точный путь, куда go install положит бинарник для текущего пакета. Запустите её в папке вашего проекта — увидите что-то вроде /home/user/go/bin/myapp.

В итоге: для своих утилит используйте go install с добавлением $GOPATH/bin в PATH, а для одноразовых экспериментов — go run или go build.