Перестраивается ли go.sum с нуля при запуске проекта
Что проверяют
Понимаете ли вы, за что отвечает go.sum, и не путаете ли его с lock-файлом из мира npm. Практическая польза вопроса в том, что неверный ответ обычно означает человека, который решает конфликты в этом файле удалением.
Как отвечать
Нет, с нуля он не перестраивается. Сборка и тесты по умолчанию идут в режиме только для чтения: go build, go run, go test сверяют скачанные модули с записанными суммами и, если строки не хватает, останавливаются с подсказкой выполнить go mod tidy или go get. Менять файл имеют право именно команды управления зависимостями.
Дальше стоит развести роли. Версии фиксирует go.mod вместе с алгоритмом выбора минимальной версии, поэтому сборка воспроизводима и без go.sum. Сам go.sum хранит контрольные суммы архивов модулей и их файлов go.mod, включая версии, которые в текущую сборку не попали, поэтому он заметно длиннее списка зависимостей. Суммы сверяются с базой контрольных сумм, для внутренних репозиториев проверка отключается через GOPRIVATE и GONOPROXY, а go mod verify проверяет, что распакованный кеш модулей не изменился.
Где спотыкаются
Считают go.sum лишним и вносят его в список игнорируемых файлов или удаляют при конфликте слияния. Сборка после этого работает, но проверка целостности пропадает, и подменённый в кеше или зеркале модуль проезжает молча. Конфликт разрешается запуском go mod tidy, а не ручным выбором строк.
Второе: ждут, что сборка сама допишет недостающую сумму, как это было в старых версиях. Она падает, и в командах это выглядит как «локально собирается, в CI нет», хотя разница всего лишь в незакоммиченном файле.
Третье: путают go mod tidy и go get -u. Первый приводит файлы в соответствие с кодом, второй поднимает версии зависимостей. Случайный go get -u перед релизом превращает мелкую правку в обновление половины дерева.