2013-03-05 103 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