Синтаксис go.mod указан ниже с использованием расширенной формы Бэкуса-Наура (EBNF).
GoMod = { Directive } .
Directive = ModuleDirective |
GoDirective |
RequireDirective |
ExcludeDirective |
ReplaceDirective |
RetractDirective .
Новые строки, идентификаторы и строки обозначаются символами новой строки, идентификатором и строкой соответственно.
Пути и версии модулей обозначаются ModulePath и Version.
ModulePath = ident | string .
Version = ident | string .
Директива module
Директива module определяет путь к основному модулю (main module). Файл go.mod должен содержать ровно одну директиву module.
ModuleDirective = "module" ( ModulePath | "(" newline ModulePath newline ")" newline .
Пример:
module golang.org/x/net
Директива go
Директива go устанавливает ожидаемую языковую версию для модуля. Версия должна быть действующей версией релиза Go: положительное целое число, за которым следует точка, и неотрицательное целое число (например, 1.9, 1.14).
Версия языка определяет, какие языковые функции доступны при компиляции пакетов в модуле. Языковые функции, представленные в этой версии, будут доступны для использования. Языковые функции, удаленные в более ранних версиях или добавленные в более поздние версии, будут недоступны. Языковая версия не влияет на теги сборки, которые определяются используемой версией Go.
Языковая версия также используется для включения функций в команде go. Например, автоматический вендоринг может быть включен в версии 1.14 или выше.
Файл go.mod может содержать не более одной директивы go. Большинство команд добавят директиву go в текущую версию Go, если она отсутствует.
GoDirective = "go" GoVersion newline .
GoVersion = string | ident . /* действующая версия релиза */
Пример:
go 1.14
Директива require
Директива require объявляет минимально необходимую версию данной зависимости модуля. Для каждой требуемой версии модуля команда go загружает файл go.mod для этой версии и включает требования из этого файла. После того, как все требования загружены, команда go разрешает их, используя выбор минимальной версии (MVS) для создания списка сборки.
Команда go автоматически добавляет // indirect комментарии для некоторых требований. // indirect комментарий указывает, что ни один пакет из требуемого модуля не импортируется напрямую каким-либо пакетом в основном (main) модуле. Команда go добавляет косвенное требование, когда выбранная версия модуля выше, чем то, что уже подразумевается (транзитивно) другими зависимостями основного модуля. Это может произойти из-за явного обновления (go get -u), удаления какой-либо другой зависимости, которая ранее накладывала требование (go mod tidy), или зависимости, которая импортирует пакет без соответствующего требования в собственном файле go.mod (например, зависимость, в которой вообще отсутствует файл go.mod).
RequireDirective = "require" ( RequireSpec | "(" newline { RequireSpec } ")" newline ) .
RequireSpec = ModulePath Version newline .
Пример:
require golang.org/x/net v1.2.3
require (
golang.org/x/crypto v1.4.5 // indirect
golang.org/x/text v1.6.7
)
Директива exclude
Директива exclude предотвращает загрузку версии модуля командой go. Если на исключенную версию ссылается директива require в файле go.mod, команда go выведет список доступных версий для модуля (как показано с помощью go list -m -versions) и вместо этого загрузит следующую более высокую неисключенную версию. Для этой цели рассматриваются как релизная, так и предварительная версия, но псевдо-версии - нет. Если более поздних версий нет, команда go сообщит об ошибке. Обратите внимание, что это может измениться в Go 1.16.
Директивы exclude применяются только в файле go.mod главного модуля и игнорируются в других модулях.
ExcludeDirective = "exclude" ( ExcludeSpec | "(" newline { ExcludeSpec } ")" ) .
ExcludeSpec = ModulePath Version newline .
Пример:
exclude golang.org/x/net v1.2.3
exclude (
golang.org/x/crypto v1.4.5
golang.org/x/text v1.6.7
)
Директива replace
Директива replace заменяет содержимое определенной версии модуля или всех версий модуля содержимым, найденным в другом месте. Для замены можно указать либо другой путь к модулю и версию, либо путь к файлу, зависящий от платформы.
Если версия указана слева от стрелки (=>), заменяется только эта конкретная версия модуля; другие версии будут доступны в обычном режиме. Если левая версия не указана, заменяются все версии модуля.
Если путь справа от стрелки является абсолютным или относительным (начинается с ./ или ../), он интерпретируется как локальный путь к корневому каталогу заменяющего модуля, который должен содержать файл go.mod. В этом случае заменяющая версия не указывается.
Если путь с правой стороны не является локальным путем, это должен быть допустимый путь к модулю. В этом случае требуется версия. Та же версия модуля также не должна отображаться в списке сборки.
Независимо от того, указана ли замена с локальным путем или путем к модулю, если у заменяющего модуля есть файл go.mod, его директива модуля должна соответствовать пути модуля, который он заменяет.
Директивы replace применяются только в файле go.mod главного модуля и игнорируются в других модулях.
ReplaceDirective = "replace" ( ReplaceSpec | "(" newline { ReplaceSpec } ")" newline ")" ) .
ReplaceSpec = ModulePath [ Version ] "=>" FilePath newline
| ModulePath [ Version ] "=>" ModulePath Version newline .
FilePath = /* относительный или абсолютный путь к файлу, зависящий от платформы */
Пример:
replace golang.org/x/net v1.2.3 => example.com/fork/net v1.4.5
replace (
golang.org/x/net v1.2.3 => example.com/fork/net v1.4.5
golang.org/x/net => example.com/fork/net v1.4.5
golang.org/x/net v1.2.3 => ./fork/net
golang.org/x/net => ./fork/net
)
Читайте также:
- Модули в Golang: файл go.mod
- Модули в Golang: файл go.mod, лексические элементы
- Модули в Golang: файл go.mod, пути и версии модулей
Комментариев нет:
Отправить комментарий