2013-03-05 18 views
22

Devo essere in grado di creare versioni diverse di un'applicazione go; una versione di 'debug' e una versione normale.Come utilizzare correttamente i tag di compilazione?

Questo è facile da fare; Ho semplicemente un const DEBUG, che controlla il comportamento dell'applicazione, ma è fastidioso dover modificare il file di configurazione ogni volta che ho bisogno di scambiare tra i tipi di build.

stavo leggendo accumulo go (http://golang.org/pkg/go/build/) e tag, ho pensato che forse avrei potuto fare questo:

config.go:

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

config.debug.go:

// +build debug 
package build 
const DEBUG = true 

Quindi dovrei essere in grado di creare usando "go build" o "go build -tags debug", e i tag dovrebbero escludere config.go e includere config.debug.go.

... ma questo non funziona. Ottengo:

src/build/config.go: 3: DEBUG ridichiarato in questo blocco (< 0>) precedente dichiarazione in src/build/config.debug.go: 3

Che cosa sto facendo di sbagliato?

Esiste un altro e più appropriato metodo #ifdef per fare ciò che dovrei usare?

risposta

23

Vedere my answer to another question. Hai bisogno di una riga vuota dopo la riga "// + build".

Inoltre, probabilmente si desidera il "!" in config.go, non in config.debug.go; e presumibilmente vuoi che uno sia "DEBUG = false".

+0

sì grazie, questo era il problema; domanda modificata per essere meno stupida. – Doug

13

Si potrebbe utilizzare la compilazione costanti di tempo per questo: Se si compila il programma con

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

la variabile DEBUG dal pacchetto principale sarà impostato alla stringa "SI". Altrimenti mantiene i suoi contenuti dichiarati.

package main 

import (
    "fmt" 
) 

var DEBUG = "NO" 

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

Edit: dal Go 1.6 l'interruttore è -X main.DEBUG=YES, prima che fosse -X main.DEBUG YES (senza =) (?). Grazie a un commento di @poorva.

+1

Ciò è possibile per i dati non stringa? –

+0

@MattJoiner non ha provato tutto ma è possibile con ints. – mschuett

+0

il comando è ora cambiato in - 'go build -ldflags '-X main.DEBUG = YES' test.go' – poorva

Problemi correlati