Скажите, что у меня есть проект go, основанный на том, какая ОС, а в некоторых случаях это дистрибутив, я хочу использовать клиентский пакет Systemd и пакет клиента Upstart, а не клиентский пакет sysv, и пакет клиента launchd. Можно ли выборочно импортировать каждый пакет, поэтому я импортирую только тот, который мне нужен, для OS/distro, для которого я строю? Или мне нужно импортировать каждый пакет для каждой ОС/дистрибутива?Могу ли я импортировать пакет Golang на основе ОС, для которых я строю?
ответ
Скопление ограничение, также известный как сборки тега, является строка комментария, что начинается
// +build
, в котором перечислены условия, при которых файл должен быть включенным в пакет . Ограничения могут отображаться в любом виде исходного файла (не только Go), но они должны отображаться в верхней части файла, перед ними должны быть только пустые строки и другие комментарии к строке. Эти правила означают, что в файлах Go должно существовать ограничение сборки перед предложением пакета.
Чтобы отличить ограничения сборки от документации пакета, строка ограничений сборки должна сопровождаться пустой строкой.
Ограничение сборки оценивается как OR опций, разделенных пробелами; каждый вариант оценивается как AND его разделенных запятыми терминов; и каждый термин является буквенно-цифровым словом или предшествует его отрицанию. То есть ограничение сборки:
// +build linux,386 darwin,!cgo
соответствует булевой формуле:
(linux AND 386) OR (darwin AND (NOT cgo))
Файл может иметь несколько ограничений сборки. Общее ограничение составляет AND индивидуальных ограничений. То есть, строят ограничения:
// +build linux darwin // +build 386
соответствует булевой формуле:
(linux OR darwin) AND 386
В течение определенного телосложения, следующие слова удовлетворены:
- the target operating system, as spelled by runtime.GOOS - the target architecture, as spelled by runtime.GOARCH - the compiler being used, either "gc" or "gccgo" - "cgo", if ctxt.CgoEnabled is true - "go1.1", from Go version 1.1 onward - "go1.2", from Go version 1.2 onward - "go1.3", from Go version 1.3 onward - "go1.4", from Go version 1.4 onward - "go1.5", from Go version 1.5 onward - "go1.6", from Go version 1.6 onward - any additional words listed in ctxt.BuildTags
Если имя файла, после снятия удлинителя и возможного суффикса _test , соответствует любому из следующих паттернов:
*_GOOS *_GOARCH *_GOOS_GOARCH
(пример: source_windows_amd64.go), где GOOS и GOARCH представляют собой любое известного операционной системы и архитектуры значения соответственно, то файл считается иметь неявное ограничение, требующие сборками этих условия (в дополнении к любым явным ограничениям в файле).
Чтобы сохранить файл из рассматриваемых для сборки:
// +build ignore
(любое другое неудовлетворенного слово будет работать как хорошо, но «игнорировать» является условна.)
Чтобы построить только файл при использовании ОЦП, и только на Linux и OS X:
// +build linux,cgo darwin,cgo
Такой файл, как правило, в паре с другой файл реализации функциональность по умолчанию для других систем, которые в данном случае будут нести ограничение:
// +build !linux,!darwin !cgo
Naming файл dns_windows.go заставит его быть включена только при сборке пакета для Windows; Аналогично, math_386.s будет включен только при создании пакета для 32-разрядного x86.
Использование GOOS = android подходит для создания тегов и файлов как для GOOS = linux в дополнение к тегам и файлам Android.
Использовать ограничения сборки.
Используйте один пакет с несколькими файлами. Каждый файл специализируется на конкретной ОС, архитектуре и т. Д., Комбинации.