суббота, 6 июля 2019 г.

Поддержка требований модуля в Golang

Файл go.mod предназначен для чтения и редактирования как программистами, так и инструментами. Сама команда go автоматически обновляет файл go.mod для поддержания стандартного форматирования и точности операторов require.

Любая команда go, которая находит незнакомый импорт, ищет модуль, содержащий этот импорт, и автоматически добавляет последнюю версию этого модуля в go.mod. Следовательно, в большинстве случаев достаточно добавить импорт в исходный код и запустить 'go build', 'go test' или даже 'go list': в рамках анализа пакета команда go обнаружит и разрешит импорт и обновит файл go.mod.

Любая команда go может определить, что требование к модулю отсутствует и должно быть добавлено, даже если рассматривается только один пакет из модуля. С другой стороны, определение того, что требование к модулю больше не требуется и может быть удалено, требует полного просмотра всех пакетов в модуле во всех возможных конфигурациях сборки (архитектуры, операционные системы, теги сборки и т.д.). Команда 'go mod tidy' создает это представление, а затем добавляет все отсутствующие требования к модулю и удаляет ненужные.

В рамках поддержки операторов require в go.mod команда go отслеживает, какие из них предоставляют пакеты, импортированные непосредственно текущим модулем, а какие предоставляют пакеты, только косвенно используемые другими зависимостями модуля. Требования, необходимые только для косвенного использования, помечаются комментарием "// indirect" в файле go.mod. Косвенные требования автоматически удаляются из файла go.mod, если они подразумеваются другими прямыми требованиями. Косвенные требования возникают только при использовании модулей, которые не в состоянии указать некоторые из своих собственных зависимостей, или при явном обновлении зависимостей модуля до его собственных заявленных требований.

Благодаря такому автоматическому обслуживанию информация в go.mod представляет собой актуальное, читаемое описание сборки.

Команда 'go get' обновляет go.mod для изменения версий модулей, используемых в сборке. Обновление одного модуля может подразумевать обновление других, и аналогично понижение одного модуля может означать понижение других. Команда 'go get' также вносит эти подразумеваемые изменения. Если go.mod редактируется напрямую, такие команды, как 'go build' или 'go list', предполагают, что обновление предназначено, автоматически производят любые подразумеваемые обновления и обновляют go.mod для их отражения.

Команда 'go mod' предоставляет другие функциональные возможности для поддержки и понимания модулей и файлов go.mod. Смотрите go help mod.

Флаг сборки -mod обеспечивает дополнительный контроль над обновлением и использованием go.mod.

Если вызывается с -mod=readonly, команда go не допускается из неявного автоматического обновления go.mod, описанного выше. Вместо этого происходит сбой, когда необходимы какие-либо изменения в go.mod. Этот параметр наиболее полезен для проверки того, что go.mod не нуждается в обновлениях, например, в системе непрерывной интеграции и тестирования. Команде "go get" разрешено обновлять go.mod даже с параметром -mod=readonly, а команды "go mod" не принимают флаг -mod (или любые другие флаги сборки).

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


Читайте также:


Комментариев нет:

Отправить комментарий