Команда 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.
Читайте также:
- Модули в Golang: файл go.mod, лексические элементы
- Модули в Golang: файл go.mod, пути и версии модулей
- Модули в Golang: файл go.mod, грамматика
Комментариев нет:
Отправить комментарий