2013-03-05 11 views
22

Ich muss in der Lage sein, verschiedene Versionen einer Go-Anwendung zu erstellen; eine Debug-Version und eine normale Version.Wie verwende ich Build Tags richtig?

Dies ist einfach zu tun; Ich habe einfach eine const DEBUG, die das Verhalten der Anwendung steuert, aber es ist nervig, die Konfigurationsdatei jedes Mal zu bearbeiten, wenn ich zwischen Build-Typen wechseln muss.

ich gehen build las (http://golang.org/pkg/go/build/) und Tags, dachte ich, vielleicht könnte ich dies tun:

config.go:

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

config.debug.go:

// +build debug 
package build 
const DEBUG = true 

Dann sollte ich in der Lage sein, mit "go build" oder "go build -tags debug" zu bauen, und die Tags sollten config.go ausschließen und config.debug.go einschließen.

... aber das funktioniert nicht. Ich bekomme:

src/build/config.go: 3: DEBUG in diesem Block redeklariert (< 0>) vorherige Erklärung bei src/build/config.debug.go: 3

Was mache ich falsch?

Gibt es eine andere und geeignetere #ifdef Stilweise, die ich verwenden sollte?

Antwort

23

Siehe my answer to another question. Sie benötigen eine leere Zeile nach der Zeile "// + build".

Wahrscheinlich möchten Sie auch das "!" in config.go, nicht in config.debug.go; und vermutlich wollen Sie eine "DEBUG = false" sein.

+0

yup danke, das war das problem; bearbeitete Frage, um weniger dumm zu sein. – Doug

13

könnten Sie Zeitkonstanten für das kompilieren: Wenn Sie Ihr Programm kompilieren mit

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

die Variable DEBUG von Paket Haupt wird die Zeichenkette „YES“ eingestellt werden. Ansonsten behält es seinen deklarierten Inhalt.

package main 

import (
    "fmt" 
) 

var DEBUG = "NO" 

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

Edit: da Go 1.6 ist der Schalter -X main.DEBUG=YES, vor, dass es -X main.DEBUG YES war (ohne =) (?). Danke an einen Kommentar von @poorva.

+1

Ist dies für Nicht-String-Daten möglich? –

+0

@MattJoiner hat nicht alles getestet, aber es ist mit Ints möglich. – mschuett

+0

Der Befehl wird jetzt geändert in - 'go build -ldflags '-X main.DEBUG = JA' test.go' – poorva

Verwandte Themen