четверг, 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'.


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


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

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