Go Build Tag
文档翻译
build 约束 (Build Constraint, 构建约束) 又叫 build 标签 (Build Tag, 构建标签) , 是以 // +build
开头的注释。
它列出了在一个包中应该包含哪一个文件的条件。约束 (Constraints) 可能出现在任何类型的文件中 (不仅仅是 go 文件),但他们必须在文件的顶端位置,前面可以有空行和其他注释行。这就意味着 build 约束必须出现在 package 语句之前。
为了从包文档中区分出 build 约束, 一连串的 build 约束必须后面跟一个空行。
build 约束选项中, 以空格分隔来表示 OR 的关系;以逗号分隔来表示 AND 的关系。每一项可以由 字母、数字、下划线、点 组成。一个项可以用 !
前缀来表是否定。
例如:
// +build linux,386 darwin,!cgo
对应的 boolean 公式为:
(linux AND 386) OR (darwin AND (NOT cgo))
一个文件可能有多个 build 约束,所有的约束是 AND 的关系,即:
// +build linux darwin
// +build 386
对应的 boolean 公式为:
(linux OR darwin) AND 386
在指定的编译期间,下面的词语可以生效
- 目标操作系统 runtime.GOOS 的拼写
- 目标架构 runtime.GOARCH 的拼写
- 使用的编译器 `gc` 或 `gccgo`
- "cgo", 如果 ctxt.CgoEnabled 是 true
- "go1.1", 从 Go 版本 1.1 起
- "go1.2", 从 Go 版本 1.2 起
- "go1.3", 从 Go 版本 1.3 起
- "go1.4", 从 Go 版本 1.4 起
- "go1.5", 从 Go 版本 1.5 起
- "go1.6", 从 Go 版本 1.6 起
- "go1.7", 从 Go 版本 1.7 起
- "go1.8", 从 Go 版本 1.8 起
- "go1.9", 从 Go 版本 1.9 起
- "go1.10", 从 Go 版本 1.10 起
- "go1.11", 从 Go 版本 1.11 起
- "go1.12", 从 Go 版本 1.12 起
- "go1.13", 从 Go 版本 1.13 起
- "go1.14", 从 Go 版本 1.14 起
- **任何在 ctxt.BuildTags 中列出的标签** (`go build -tags a,b,c ./...`)
还有一些在 beta 或 minor 版本中指定了不需要编译的标签。
如果一个文件的名字,在剥除扩展字段好可能的 _test
后缀后,与如下模式匹配:
*_GOOS
*_GOARCH
*_GOOS_GOARCH
(例如 example: source_windows_amd64.go
) GOOS 和 GOARCH 分别表示任何可能的操作系统和架构,那么这个文件被认为有一个隐式的构建约束。
为了避免一个文件被构建,可以用:
// +build ignore
(any other unsatisfied word will work as well, but “ignore” is conventional.)
如果仅在用 cgo 且在 linux 或 OS X 上构建一个文件,用:
// +build linux,cgo darwin,cgo
这样的一个文件通常有一个成对的文件来用于其他系统,这时成对的文件会用:
// +build !linux,!darwin !cgo
文件名为 dns_windows.go
将仅包含在 Windows 系统中构建的包中;类似的,math_386.s
将仅在 32-bit x86 系统中构建的包中包含。
用 GOOS=android
来匹配构建标签和文件
Using GOOS=android matches build tags and files as for GOOS=linux in addition to android tags and files.
Using GOOS=illumos matches build tags and files as for GOOS=solaris in addition to illumos tags and files.
重点归纳
目前我们在做一个功能,引入 go-fuzz, 想要实现在正常编译的时候不将 *_fuzz.go
文件编译进二进制文件中,而只有在使用 fuzz 时构建
阅读了以上文档后,可以按如下方式实现
- 在
*_fuzz.go
文件顶部中加入// +build fuzz
(前面只允许有注释行和空行) - 在
go-fuzz-build.exe
中加入参数-tags fuzz
第一步就可以在真实构建服务时, 屏蔽 *_fuzz.go
文件,因为只有使用了 -tags fuzz
参数才会构建;
在第二步中使用了 -tags fuzz
, 已经测试过了 go-fuzz-build.exe
支持此参数且符合预期。
网友评论