вторник, 9 февраля 2021 г.

Модули в Golang: файл go.mod, автоматические обновления

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

module example.com/M

require (
    example.com/A v1
    example.com/B v1.0.0
    example.com/C v1.0.0
    example.com/D v1.2.3
    example.com/E dev
)

exclude example.com/D v1.2.3

Обновление переписывает идентификаторы неканонической версии в каноническую форму semver, поэтому v1 example.com/A становится v1.0.0, а dev example.com/E становится псевдо-версией для последней фиксации в ветке dev, возможно v0.0.0-20180523231146-b3f5c0f6e5f1.

Обновление изменяет требования для соблюдения исключений, поэтому требование на исключенном example.com/D v1.2.3 обновлено для использования следующей доступной версии example.com/D, возможно, v1.2.4 или v1.3.0.

Обновление удаляет повторяющиеся или вводящие в заблуждение требования. Например, если example.com/A v1.0.0 требует example.com/B v1.2.0 и example.com/C v1.0.0, то требование go.mod о example.com/B v1.0.0 вводит в заблуждение (заменено по потребности example.com/A в v1.2.0), а его требование example.com/C v1.0.0 является избыточным (подразумевается необходимостью example.com/A в одной и той же версии), поэтому оба будут удалены. Если основной модуль содержит пакеты, которые напрямую импортируют пакеты с example.com/B или example.com/C, то требования будут сохранены, но обновлены до фактических используемых версий.

Наконец, обновление переформатирует go.mod в каноническом формате, так что будущие механические изменения приведут к минимальным различиям. Команда go не обновит go.mod, если нужны только изменения форматирования.

Поскольку граф модуля определяет значение операторов импорта, любые команды, которые загружают пакеты, также используют и поэтому обновляют go.mod, включая go build, go get, go install, go list, go test, go mod graph, go mod tidy и go mod why.

Флаг -mod=readonly запрещает командам автоматически обновлять go.mod. Однако, если команде необходимо выполнить действие, которое приведет к обновлению до go.mod, она сообщит об ошибке. Например, если go build предлагается собрать пакет, не предоставленный каким-либо модулем в списке сборки, go build сообщит об ошибке вместо поиска модуля и обновления требований в go.mod.


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


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

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