美文网首页
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

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