2013-03-05 90 views
22

我需要能够构建go应用程序的不同版本;一个'调试'版本和一个正常版本。如何正确使用构建标签?

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

我念叨去构建(http://golang.org/pkg/go/build/)和标签,我想也许我可以这样做:

config.go:

// +build !debug 
package build 
const DEBUG = false 

config.debug.go:

// +build debug 
package build 
const DEBUG = true 

然后,我应该可以使用“go build”或“go build -tags debug”来构建,并且标记应该排除config.go并包含config.debug.go。

...但这不起作用。我得到:

SRC /构建/ config.go:3:DEBUG在该块(< 0>)以前 声明在SRC /构建重新声明/ config.debug.go:3

我究竟做错了什么?

是否有另外一种更合适的#ifdef风格的方式来做到这一点我应该使用?

回答

23

请参阅my answer to another question。在“// + build”行之后需要一个空行。

此外,你可能想要“!”在config.go中,不在config.debug.go中;大概你想要一个人是“DEBUG = false”。

+0

哟,谢谢,那就是问题;编辑的问题不那么愚蠢。 – Doug 2013-03-05 03:14:29

13

,您可以使用编译为时间常数:如果您使用

go build -ldflags '-X main.DEBUG=YES' test.go 

从包装的主要变量DEBUG将被设置为字符串“YES”编译程序。否则它保持其声明的内容。

package main 

import (
    "fmt" 
) 

var DEBUG = "NO" 

func main() { 
    fmt.Printf("DEBUG is %q\n", DEBUG) 
} 

编辑:自走1.6开关-X main.DEBUG=YES,在这之前它是-X main.DEBUG YES(不=)(?)。感谢@poorva的评论。

+1

这对非字符串数据可能吗? – 2014-10-06 13:59:39

+0

@MattJoiner没有测试任何东西,但它可能与整数。 – mschuett 2015-02-09 02:18:16

+0

该命令现在更改为 - 'go build -ldflags'-X main.DEBUG = YES'test.go' – poorva 2016-12-30 09:28:50