суббота, 6 февраля 2021 г.

Модули в Golang: файл go.mod, грамматика

Синтаксис 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
)


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


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

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