Я хотел бы привести несколько аргументов в пользу совершения vendor
, go.mod
и go.sum
.
Я согласен с аргументами принятого ответа о том, что это технически не нужно и раздувает репо.
Но вот список контраргументов:
Сборка проекта не зависит от того, какой код доступен на Github/Gitlab/... или на прокси-серверах Go. Проекты с открытым исходным кодом могут исчезнуть из-за цензуры, поощрений авторов, изменений в лицензировании или по другим причинам, о которых я сейчас не могу думать, которые произошло с npm, диспетчером пакетов JavaScript, и сломало многие проекты. Ни в вашем репозитории, ни в вашем коде.
Возможно, мы использовали внутренние или сторонние модули Go (частные), которые также могут исчезнуть или стать недоступными, но если они переданы поставщику, они являются частью нашего проекта. Ничто не ломается неожиданно.
Частные модули Go могут не следовать семантическому управлению версиями, а это означает, что инструменты Go будут полагаться на последний хэш фиксации при их извлечении на лету. История репозитория может быть переписана (например, перебазирована), и вы, коллега или ваша работа CI можете получить другой код для зависимостей, которые они используют.
Обязательный поставщик может улучшить ваш процесс проверки кода. Обычно мы всегда фиксируем изменения зависимостей в отдельной фиксации, чтобы их можно было легко просмотреть, если вам интересно.
Вот интересное наблюдение, связанное с раздуванием репо. Если я делаю обзор кода, и член команды включил новую зависимость с 300 файлами (или обновил зависимость с 300 измененными файлами), мне было бы очень любопытно углубиться в это и начать обсуждение качества кода, необходимости этого изменения. или альтернативные модули Go. Это может привести к уменьшению размера двоичного файла и общей сложности.
Если я увижу только одну новую строку в go.mod
в новом запросе на слияние, скорее всего, я даже не подумаю об этом.
- Заданиям CI/CD, которые выполняют этапы компиляции и сборки, не нужно тратить время и сеть на загрузку зависимостей каждый раз, когда выполняется задание CI. Все необходимые зависимости локальны и присутствуют (
go build -mod vendor
)
Это у меня на голове, если что-то еще вспомню, добавлю сюда.
person
luben
schedule
09.03.2021