Должен ли я зафиксировать каталог поставщика с модом go?

Я использую модули go на go1.12 для обработки своих зависимостей Go. Лучше всего также зафиксировать каталог vendor/ в системе контроля версий?

Это в некоторой степени связано с лучшей практикой зафиксировать каталог `vendor`? который задает этот вопрос в случае использования dep . С dep фиксация vendor/ — единственный способ получить действительно воспроизводимые сборки. Что насчет модулей go?


person hongsy    schedule 26.03.2020    source источник
comment
Разве это не ответ на ваш вопрос? Лучше всего зафиксировать каталог `vendor`?   -  person Tom    schedule 26.03.2020
comment
@Tom: этот ответ не относится к модулям go.   -  person Flimzy    schedule 26.03.2020


Ответы (2)


Если вам не нужно изменять пакеты поставщиков, вы не должны этого делать. Модули Go уже дают вам воспроизводимые сборки, поскольку файл go.mod записывает точные версии и хэши коммитов ваших зависимостей, которые инструмент go будет учитывать и следовать им.

Каталог vendor можно воссоздать, выполнив команду go mod vendor, и он даже игнорируется по умолчанию go build, если только вы не попросите его использовать его с флагом -mod=vendor.

Подробнее:

Перейти wiki: Как мне использовать вендорство с модулями? Торговля исчезнет?

Команда go: модули и поставщики

Команда go: создание копий зависимостей от поставщиков

person icza    schedule 26.03.2020
comment
Есть несколько других случаев, когда может иметь смысл продавать модули, о которых стоит упомянуть: если модули импортируются из частного репозитория, доступ к которому из ваших сценариев CI/сборки нецелесообразен или невозможен, или если вы опасаетесь, что он может исчезнуть из-за нестабильный сервер или что-то в этом роде, или если вы используете GopherJS, который еще не поддерживает модули :) - person Flimzy; 26.03.2020
comment
@Flimzy Да, спасибо. Хотя опубликованные модули не исчезнут, даже если исходный репозиторий станет закрытым или исчезнет, ​​официальное зеркало модулей продолжит их обслуживать. - person icza; 26.03.2020
comment
Если вы не собираетесь передавать в репозиторий модули, поставляемые поставщиками, какой смысл в этом? - person Adrian; 26.03.2020
comment
Требуется ли поставщику модов доступ к Интернету? это может быть проблемой в сценариях CI/сборки, например, о том, что упоминал @Flimzy - person hongsy; 06.04.2020
comment
ИМО, этот ответ не очень хорош, может быть, даже вреден для новых разработчиков Go. Что происходит, когда зависимые проекты удаляются из github? Почему проект kubernetes (и многие другие) помещают и фиксируют свою папку поставщика? - person luben; 09.03.2021
comment
@luben Когда проект удаляется с github, все будет продолжать работать, потому что на прокси-серверах Go есть копии общедоступных модулей. - person icza; 09.03.2021
comment
@icza До каких пор? Какую гарантию предоставляют общедоступные прокси-сервисы Go, что они будут (и как долго) продолжать предоставлять модуль Go, когда его проект будет удален из github? Что, если зависимость будет удалена из-за некоторой цензуры как со стороны github, так и со стороны прокси-сервиса Go? Дело в том, что все эти предположения и ожидания не под нашим контролем, а пакеты, зафиксированные в вендоре, локальны и полностью под нашим контролем в наших проектах. - person luben; 09.03.2021

Я хотел бы привести несколько аргументов в пользу совершения 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