четверг, 11 июля 2019 г.

Списки пакетов и шаблоны в Golang

Многие команды применяются к набору пакетов:

go action [packages]

Обычно [packages] представляет собой список путей импорта.

Путь импорта, который является корневым путем или начинается с . или .. элемента интерпретируется как путь к файловой системе и обозначает пакет в этом каталоге.

В противном случае путь импорта P обозначает пакет, найденный в каталоге DIR/src/P для некоторого DIR, указанного в переменной среды GOPATH (более подробно см. go help gopath).

Если пути импорта не указаны, действие применяется к пакету в текущем каталоге.

Есть четыре зарезервированных имени для путей, которые не должны использоваться для пакетов, которые будут собраны с помощью инструмента go:

- "main" обозначает пакет верхнего уровня в отдельном исполняемом файле.

- "all" распространяется на все пакеты, найденные во всех деревьях GOPATH. Например, 'go list all' перечисляет все пакеты в локальной системе. При использовании модулей "all" распространяется на все пакеты в основном модуле и их зависимости, в том числе зависимости, необходимые для тестирования любого из них.

- "std", как и все, распространяется только на пакеты в стандартной библиотеке Go.

- "cmd" распространяется на команды репозитория Go и их внутренние библиотеки.

Пути импорта, начинающиеся с "cmd/", соответствуют только исходному коду в репозитории Go.

Путь импорта - это шаблон, если он содержит один или несколько подстановочных знаков "...", каждая из которых может соответствовать любой строке, включая пустую строку и строки, содержащие косую черту. Такой шаблон распространяется на все каталоги пакетов, найденные в деревьях GOPATH с именами, соответствующими шаблонам.

Чтобы сделать общие шаблоны более удобными, существует два особых случая. Во-первых, /... в конце шаблона может соответствовать пустой строке, так что net/... соответствует и net, и пакетам в его подкаталогах, например, net/http. Во-вторых, любой разделенный косой чертой элемент шаблона, содержащий подстановочный знак, никогда не участвует в совпадении элемента "vendor" в пути к вендорному пакету, так что ./... не соответствует пакетам в подкаталогах ./vendor или ./mycode/vendor, но ./vendor/... и ./mycode/vendor/... соответствуют. Однако обратите внимание, что каталог с именем vendor, который сам содержит код, не является вендорным пакетом: cmd/vendor будет командой с именем vendor, и шаблон cmd/... соответствует ей.

В пути импорта также можно указать пакет для загрузки из удаленного хранилища. Запустите go help importpath для получения подробной информации.

Каждый пакет в программе должен иметь уникальный путь импорта. По договоренности, это организовано путем запуска каждого пути с уникальным префиксом, который принадлежит вам. Например, все внутренние пути в Google начинаются с 'google', а пути, обозначающие удаленные репозитории, начинаются с пути к коду, например, 'github.com/user/repo'.

Пакеты в программе не обязательно должны иметь уникальные имена пакетов, но есть два зарезервированных имени пакета со специальным значением. Имя main указывает на команду, а не на библиотеку. Команды встроены в бинарные файлы и не могут быть импортированы. Имя documentation указывает на документацию для не-Go программы в каталоге. Файлы в документации пакета игнорируются командой go.

В особом случае, если список пакетов представляет собой список файлов .go из одного каталога, команда применяется к одному синтезированному пакету, составленному именно из этих файлов, игнорируя все ограничения сборки в этих файлах и игнорируя любые другие файлы в каталоге.

Каталог и имена файлов, начинающиеся с "." или "_" игнорируются инструментом go, как и каталоги с именем "testdata".


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


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

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