Показаны сообщения с ярлыком go list. Показать все сообщения
Показаны сообщения с ярлыком go list. Показать все сообщения

среда, 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.


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


четверг, 27 июня 2019 г.

Команды go: go list, вывод списка пакетов или модулей

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

go list [-f format] [-json] [-m] [list flags] [build flags] [packages]

list выводит список именованных пакетов, по одному на строку. Чаще всего используются флаги -f и -json, которые управляют формой вывода, напечатанной для каждого пакета. Другие флаги списка, описанные ниже, контролируют более конкретные детали.

Вывод по умолчанию показывает путь импорта пакета:

bytes
encoding/json
github.com/gorilla/mux
golang.org/x/net/html

Флаг -f указывает альтернативный формат для списка, используя синтаксис шаблона пакета. Вывод по умолчанию эквивалентен -f '{{.ImportPath}}'. Структура, передаваемая в шаблон:

type Package struct {
    Dir           string   // каталог, содержащий исходный код пакета
    ImportPath    string   // путь импорта пакета в dir
    ImportComment string   // путь в import комментарии в утверждении пакета (package statement)
    Name          string   // имя пакета
    Doc           string   // строка документации пакета
    Target        string   // путь установки
    Shlib         string   // разделяемая (shared) библиотека, которая содержит этот пакет (устанавливается только когда -linkshared)
    Goroot        bool     // этот пакет в Go root?
    Standard      bool     // этот пакет является частью стандартной Go библиотеки?
    Stale         bool     // будет ли 'go install' делать что-либо с этим пакетом?
    StaleReason   string   // объяснение для Stale==true
    Root          string   // Go root или Go path dir содержащий этот пакет
    ConflictDir   string   // эта директория затеняет(shadows) Dir в $GOPATH
    BinaryOnly    bool     // бинарный пакет: не может быть перекомпилирован из исходных файлов
    ForTest       string   // пакет только для использования в именованном тесте
    Export        string   // файл, содержащий данные экспорта (при использовании -export)
    Module        *Module  // информация о модуле, содержащем пакет, если есть (может быть nil)
    Match         []string // шаблоны командной строки, соответствующие этому пакету
    DepOnly       bool     // пакет является только зависимостью, явно не перечисляемой

    // Исходные файлы
    GoFiles         []string // .go исходные файлы (исключая CgoFiles, TestGoFiles, XTestGoFiles)
    CgoFiles        []string // .go исходные файлы которые импортируют "C"
    CompiledGoFiles []string // .go файлы, представленные компилятору (при использовании -compiled)
    IgnoredGoFiles  []string // .go исходные файлы игнориремые из-за ограничений сборки
    CFiles          []string // .c исходные файлы
    CXXFiles        []string // .cc, .cxx и .cpp исходные файлы
    MFiles          []string // .m исходные файлы
    HFiles          []string // .h, .hh, .hpp и .hxx исходные файлы
    FFiles          []string // .f, .F, .for и .f90 Fortran исходные файлы
    SFiles          []string // .s исходные файлы
    SwigFiles       []string // .swig файлы
    SwigCXXFiles    []string // .swigcxx файлы
    SysoFiles       []string // .syso object файлы для добавления в архив
    TestGoFiles     []string // _test.go файлы в пакете
    XTestGoFiles    []string // _test.go файлы во внешнем пакете

    // Cgo директивы
    CgoCFLAGS    []string // cgo: флаги для C компилятора
    CgoCPPFLAGS  []string // cgo: флаги для C препроцессора
    CgoCXXFLAGS  []string // cgo: флаги для C++ компилятора
    CgoFFLAGS    []string // cgo: флаги для Fortran компилятора
    CgoLDFLAGS   []string // cgo: флаги для линкера (linker)
    CgoPkgConfig []string // cgo: pkg-config имена
    // Информация о зависимости
    Imports      []string          // import использованные для этого пакета
    ImportMap    map[string]string // карта (map) из исходного import в ImportPath (идентификационные записи опущены)
    Deps         []string          // все (рекурсивно) импортированные зависимости
    TestImports  []string          // импорты из TestGoFiles
    XTestImports []string          // импорты из XTestGoFiles

    // Информация об ошибке
    Incomplete bool            // этот пакет или зависимость имеет ошибку
    Error      *PackageError   // ошибка загрузки пакета
    DepsErrors []*PackageError // ошибки загрузки зависимостей
}

Пакеты, хранящиеся в каталогах поставщиков (vendor directories), сообщают о ImportPath, который включает путь к каталогу поставщика (например, "d/vendor/p" вместо "p"), так что ImportPath уникально идентифицирует данную копию пакета. Списки Imports, Deps, TestImports и XTestImports также содержат эти расширенные пути импорта.

Информация об ошибке, если таковая имеется,

type PackageError struct {
    ImportStack   []string // кратчайший путь от пакета, названного в командной строке, к этому
    Pos           string   // позиция ошибки (если есть, файл:строка:столбец)
    Err           string   // сама ошибка
}

Информация модуля является Module структурой, определенной в обсуждении списка -m ниже.

Функция шаблона "join" вызывает strings.Join.

Функция шаблона "context" возвращает контекст сборки, определенный как:

type Context struct {
    GOARCH        string   // целевая архитектура
    GOOS          string   // целевая операционная система
    GOROOT        string   // Go root
    GOPATH        string   // Go path
    CgoEnabled    bool     // можно ли использовать cgo
    UseAllFiles   bool     // использовать файлы независимо от +build строк, имен файлов
    Compiler      string   // компилятор для предположения при вычислении целевых путей
    BuildTags     []string // build огрничения для соотвествия в +build строках
    ReleaseTags   []string // выпуска текущего релиза совместимого с
    InstallSuffix string   // суффикс для использования в имени установочного каталога
}

Для получения дополнительной информации о значении этих полей см. документацию для типа Context пакета go/build.

Флаг -json заставляет печатать данные пакета в формате JSON вместо использования формата шаблона.

Флаг -compiled заставляет список устанавливать CompiledGoFiles в исходные файлы Go, представленные компилятору. Обычно это означает, что он повторяет файлы, перечисленные в GoFiles, а затем также добавляет код Go, сгенерированный путем обработки CgoFiles и SwigFiles. Список Imports содержит объединение всех импортов из GoFiles и CompiledGoFiles.

Флаг -deps заставляет list перебирать не только именованные пакеты, но и все их зависимости. Он просматривает их в глубине первого обхода после заказа, так что пакет перечисляется только после всех его зависимостей. Для пакетов, явно не указанных в командной строке, для поля DepOnly будет установлено значение true.

Флаг -e изменяет обработку ошибочных пакетов, которые не могут быть найдены или искажены. По умолчанию команда list выводит ошибку на стандартную ошибку для каждого ошибочного пакета и не учитывает пакеты при обычной печати. С флагом -e команда list никогда не печатает ошибки в стандартную ошибку и вместо этого обрабатывает ошибочные пакеты обычной печатью. Ошибочные пакеты будут иметь непустое поле ImportPath и не нулевую Error; другая информация может отсутствовать или может не отсутствовать (обнулена).

Флаг -export приводит к тому, что list устанавливает в поле Export имя файла, содержащего актуальную информацию об экспорте для данного пакета.

Флаг -find заставляет список идентифицировать именованные пакеты, но не разрешать их зависимости: списки Imports и Deps будут пустыми.

Флаг -test заставляет list сообщать не только о названных пакетах, но и об их бинарных файлах тестов (для пакетов с тестами), чтобы передать инструментам анализа исходного кода, как именно создаются тестовые бинарные файлы. Указанный путь импорта для тестового бинарного файла - это путь импорта пакета, за которым следует суффикс ".test", как в "math/rand.test". При создании теста иногда необходимо перестроить определенные зависимости специально для этого теста (чаще всего сам тестируемый пакет). Указанный путь импорта пакета, перекомпилированного для конкретного тестового бинарного файла, сопровождается пробелом и именем тестового бинарного файла в скобках, как в "math/rand [math/rand.test]" или "regexp [sort.test]". В поле ForTest также указывается имя тестируемого пакета ("math/rand" или "sort" в предыдущих примерах).

Пути к файлам Dir, Target, Shlib, Root, ConflictDir и Export - это абсолютные пути.

По умолчанию списки GoFiles, CgoFiles и т.д. Содержат имена файлов в Dir (то есть пути относительно Dir, а не абсолютные пути). Сгенерированные файлы, добавленные при использовании флагов -compiled и -test, представляют собой абсолютные пути, ссылающиеся на кэшированные копии сгенерированных исходных файлов Go. Хотя они являются исходными файлами Go, пути могут не заканчиваться на ".go".

Флаг -m заставляет list перечислять модули вместо пакетов.

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

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

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

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

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

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

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

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

my/main/module
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 all' может быть удобнее анализировать.)

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

Аргументы для списка -m интерпретируются как список модулей, а не пакетов. Основным модулем является модуль, содержащий текущий каталог. Активные модули являются основным модулем и его зависимостями. Без аргументов list -m показывает основной модуль. С аргументами list -m показывает модули, указанные аргументами. Любой из активных модулей может быть указан его путем к модулю. Специальный шаблон "all" определяет все активные модули, сначала основной модуль, а затем зависимости, отсортированные по пути модуля. Шаблон, содержащий "...", указывает активные модули, чьи пути модулей соответствуют шаблону. Запрос формы path@version указывает результат этого запроса, который не ограничивается активными модулями. Смотрите 'go help modules' для получения дополнительной информации о запросах модулей.

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

Для получения дополнительной информации о флагах сборки см. 'go help build'.

Подробнее об указании пакетов см. 'go help packages'.

Для получения дополнительной информации о модулях см. 'go help modules'.


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