如何正确使用构建标签?

Dou*_*oug 26 build go

我需要能够构建一个go应​​用程序的不同版本; 'debug'版本和普通版本.

这很容易做到; 我只是有一个const DEBUG,它控制着应用程序的行为,但是每次我需要在构建类型之间进行交换时都必须编辑配置文件.

我正在阅读关于go build(http://golang.org/pkg/go/build/)和标签,我想也许我可以这样做:

config.go:

// +build !debug
package build
const DEBUG = false
Run Code Online (Sandbox Code Playgroud)

config.debug.go:

// +build debug
package build
const DEBUG = true
Run Code Online (Sandbox Code Playgroud)

然后我应该能够使用"go build"或"go build -tags debug"进行构建,标签应该排除config.go并包含config.debug.go.

......但这不起作用.我明白了:

src/build/config.go:3:DEBUG在此块(<0>)中重新声明src/build/config.debug.go上的声明:3

我究竟做错了什么?

是否有其他更合适的#ifdef风格的方式我应该使用?

axw*_*axw 29

看看我对另一个问题的回答.在"// + build"行之后需要一个空行.

另外,你可能想要"!" 在config.go中,而不是在config.debug.go中; 并且大概你想要一个"DEBUG = false".


top*_*kip 22

您可以使用编译时常量:如果您使用编译程序

go build -ldflags '-X main.DEBUG=YES' test.go
Run Code Online (Sandbox Code Playgroud)

DEBUG包main中的变量将设置为字符串"YES".否则它保留其声明的内容.

package main

import (
    "fmt"
)

var DEBUG = "NO"

func main() {
    fmt.Printf("DEBUG is %q\n", DEBUG)
}
Run Code Online (Sandbox Code Playgroud)

编辑:因为Go 1.6(?)-X main.DEBUG=YES之前的开关是-X main.DEBUG YES(没有=).感谢@poorva的评论.