go get и зависимости

Тема дорожной карты · Golang

go get — команда Go-тулчейна для добавления, обновления и удаления зависимостей модулей; это основная точка входа для загрузки пакетов из прокси Go-модулей в Golang-проект. Команда go get github.com/gin-gonic/gin@v1.9.1 добавляет указанный модуль точной версии, обновляет go.mod директивой require и обновляет go.sum криптографическими контрольными суммами, гарантирующими воспроизводимость сборок. go get ./... без явного обновления зависимостей повышает все пакеты текущего модуля до последних совместимых версий согласно semver, а go get module@none удаляет зависимость. Команда go mod tidy дополняет go get: она удаляет неиспользуемые записи из go.mod и go.sum и добавляет недостающие транзитивные зависимости; рекомендуется запускать go mod tidy перед каждым коммитом и в CI-пайплайнах. Управление зависимостями Go опирается на прокси модулей (GOPROXY=https://proxy.golang.org) и базу контрольных сумм (GONOSUMCHECK, GONOSUMDB), которые обеспечивают безопасность и доступность — необходимые условия для воспроизводимых Docker- и Kubernetes-развёртываний Golang-сервисов в изолированных или корпоративных средах.

Как это работает

go get и зависимости использует Go modules (с 1.11) — go mod init, go mod tidy, go mod download, go.mod + go.sum файлы. Module path — префикс импорта; semver enforced; go-команда обрабатывает vendoring (go mod vendor) и проксирование через proxy.golang.org. Тулчейн: go build, go run, go test, go fmt, go vet, go install, go work (multi-module workspaces). Third-party: staticcheck, golangci-lint.

Когда применять

Всегда коммитьте go.sum (верифицирует контрольные суммы модулей). go mod tidy регулярно — держите go.mod минимальным. replace-директива в go.mod — для локальной разработки зависимости. golangci-lint в CI — пакетирует vet, staticcheck, errcheck и десятки полезных линтеров. Для приватных модулей GOPRIVATE=*.yourcompany.ru — обходит публичный прокси.

Типичные ошибки

Ловушки go get и зависимости: pre-1.11 GOPATH-workflow (давно мёртв — кто учит этому, учит устаревшему Go); replace-директивы оставлены в production go.mod (используйте build-time-only override); коммит папки vendor/ без -mod=vendor policy в CI; go install вне модуля (в старом Go ставило в $GOPATH/bin, в новом требует @version).

Связанные понятия

Полезные ресурсы