美文网首页
Go Build Tag

Go Build Tag

作者: Robin92 | 来源:发表于2020-07-24 18:54 被阅读0次

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 支持此参数且符合预期。

相关文章

  • Go Build Tag

    Go Build Tag 文档翻译 原始文档参考 中文参考 build 约束 (Build Constraint,...

  • Golang标准库——go(2)

    build constant doc build 包build收集有关Go的信息。 Go Path Go路径是包含...

  • docker

    docker build -f dockfile -t tag:version . // to build one...

  • Go语言命令行工具介绍-3

    章节 命令-go build 命令-go run 命令-go get 1.go build 用于编译源码文件、代码...

  • GO 命令

    go run go build go install go list

  • go-day1

    Go 命令 go build :编译Go程序 go build -o "xx.exe" :编译成xx.exe文件 ...

  • 2021-03-04 - 2

    执行方法1 go build 执行代码的路径 例如 :go build /Users/apple/go/src/g...

  • go语言包管理总结

    我们诸如用go run或者go build等命令来编译/运行我们的go程序 当使用go run或者go build...

  • 如何拿到 go build -x 输出内容

    我在使用 go build -x -a -w main.go > build.sh时,本来想把 build 的整个...

  • 【golang】go install与go build的区别

    go install与go build都可生成执行文件 go build 会生成可实行文件放在当前目录中。 go ...

网友评论

      本文标题:Go Build Tag

      本文链接:https://www.haomeiwen.com/subject/snsslktx.html