среда, 17 февраля 2021 г.

Модули в Golang: команды с поддержкой модулей, go list -m

Использование:

go list -m [-u] [-versions] [list flags] [modules]

Пример:

$ go list -m all
$ go list -m -versions example.com/m
$ go list -m -json example.com/m@latest

Флаг -m заставляет go list выводить список модулей вместо пакетов. В этом режиме аргументы для go list могут быть модулями, шаблонами модулей (содержащими подстановочный знак ...), запросами версии или специальным шаблоном all, который соответствует всем модулям в списке сборки. Если аргументы не указаны, отображается основной модуль (main module).

При перечислении модулей флаг -f по-прежнему указывает шаблон формата, применяемый к структуре Go, но теперь это структура Module:

type Module struct {
    Path      string       // путь к модулю
    Version   string       // версия модуля
    Versions  []string     // доступные версии модуля (для -versions)
    Replace   *Module      // заменен этим модулем
    Time      *time.Time   // время создания версии
    Update    *Module      // доступное обновление, если есть (для -u)
    Main      bool         // это основной модуль (main module)?
    Indirect  bool         // этот модуль только косвенная зависимость от основного модуля?
    Dir       string       // каталог, содержащий файлы для этого модуля, если есть
    GoMod     string       // путь к файлу go.mod для этого модуля, если есть
    GoVersion string       // версия go, используемая в модуле
    Error     *ModuleError // ошибка загрузки модуля
}

type ModuleError struct {
    Err string // сама ошибка
}

По умолчанию выводится путь к модулю, а затем информация о версии и замене, если таковая имеется. Например, go list -m all может напечатать:

example.com/main/module
golang.org/x/text v0.3.0 => /tmp/text
rsc.io/pdf v0.1.1

В структуре Module есть метод String, который форматирует эту строку вывода, так что формат по умолчанию эквивалентен -f '{{.String}}'.

Обратите внимание, что когда модуль был заменен, его поле Replace описывает модуль заменяемого модуля, а его поле Dir устанавливается на исходный код заменяющего модуля, если он присутствует. (То есть, если Replace не равно nil, тогда Dir устанавливается в Replace.Dir, без доступа к замененному исходному коду.)

Флаг -u добавляет информацию о доступных обновлениях. Если последняя версия данного модуля новее, чем текущая, list -u устанавливает в поле Update модуля информацию о более новом модуле. list -u также напечатает, отозвана (retracted) ли текущая выбранная версия. Метод String модуля указывает доступное обновление путем форматирования новой версии в скобках после текущей версии. Например, go list -m -u all может напечатать:

example.com/main/module
golang.org/x/net v0.1.0 (retracted) [v0.2.0]
golang.org/x/text v0.3.0 [v0.4.0] => /tmp/text
rsc.io/pdf v0.1.1 [v0.1.2]

(Для инструментов, go list -m -u -json может быть более удобным для синтаксического анализа.)

Флаг -versions заставляет list установить в поле Versions модуля список всех известных версий этого модуля, упорядоченных в соответствии с семантическим управлением версиями, от наименьшего к наибольшему. Флаг также изменяет формат вывода по умолчанию для отображения пути к модулю, за которым следует список версий, разделенных пробелами. Отозванные версии не включаются в этот список, если также не указан флаг -retracted.

Флаг -retracted инструктирует list показывать отозванные версии в списке, напечатанном с флагом -versions, и учитывать отозванные версии при разрешении запросов о версиях. Например, go list -m -retracted example.com/m@latest показывает самый высокий релиз или предварительную версию модуля example.com/m, даже если эта версия отозвана. Директивы retract загружаются из файла go.mod в этой версии. Флаг -retracted был добавлен в Go 1.16.

Шаблонная функция module принимает единственный строковый аргумент, который должен быть путем к модулю или запросом, и возвращает указанный модуль как структуру Module. В случае возникновения ошибки результатом будет структура Module с полем Error, отличным от nil.


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


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

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