Go Modules — стандартный механизм управления зависимостями, представленный в Go 1.11+. Основные файлы — это go.mod (определяет минимальные зависимости и их версии) и go.sum (гарантирует целостность через хэши).
Для добавления зависимости используется:
go get github.com/pkg/errors@v0.9.1
Для обновления зависимостей —
go get -u ./... go mod tidy # удалить неиспользуемое
Go поддерживает семантическое версионирование (semver), а зависимости фиксируются жестко: проект повторим, сборка детерминирована. Но стоит учитывать:
Что произойдет, если удалить файл go.sum и запустить команду go build, а также чем это опасно?
Многие думают, что Go просто пересоберёт зависимости с нуля. Но файл go.sum содержит хэши всех используемых модулей и защищает от подмены (supply-chain attack). Если его удалить,
при следующем build Go скачает зависимости заново, воссоздаст файл, но если репозиторий зависимости изменён злоумышленником — защита сломана! Возможна подмена кода в продакшене.
История
На крупном проекте репозиторий перешёл с vendoring на go modules, забыли зафиксировать версии. Через месяц обновления сторонних пакетов сломали совместимость, стало невозможно собрать старую ветку — код потерял воспроизводимость.
История
В другом проекте разработчик случайно удалил go.sum. После повторного запуска команда заметила, что часть зависимостей поменялись, появились баги, связанные с несовместимостью minor-версий — из-за этого возник откат на несколько дней назад.
История
Использование replace-путей на локальные директории (replace ... = ../some/library) не было удалено перед деплоем — в CI/CD пайплайне сборка провалилась, так как внешняя система не имела доступа к локальным файлам, а продакшн оказался "запинен" на некорректной версии.