2013-03-05 49 views
22

Bir go uygulamasının farklı sürümlerini oluşturabilmem gerekir; Bir 'hata ayıklama' sürümü ve normal bir sürüm.Yapı etiketleri nasıl düzgün kullanılır?

Bunu yapmak çok kolaydır; Uygulamanın davranışını kontrol eden bir DEBUG değerine sahibim, ancak yapı türleri arasında takas etmem gereken her defasında yapılandırma dosyasını düzenlemek zorunda kalmak sinir bozucu.

ben gidip yapı ( http://golang.org/pkg/go/build/) ve etiketlerle ilgili okuyordu

, diye düşündüm belki de yapabilirsiniz:

config.go:

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

config.debug.go:

// +build debug 
package build 
const DEBUG = true 

O zaman "go build" veya "build -tags debug" komutunu kullanarak oluşturmam gerekir ve etiketler config.go'yi hariç tutmalı ve config.debug.go dosyasını içermelidir.

... ama bu işe yaramıyor. Ben olsun:

src/build/config.go: 3: DEBUG bu blokta (< 0>) src/yapı önceki beyan redeclared.Bu/config.debug.go: 3

Neyi yanlış yapıyorum?

Bunu kullanmanın başka bir daha uygun #ifdef stili yolu var mı?

cevap

23

Bkz. my answer to another question. "// + build" satırından sonra boş bir satıra ihtiyacınız var.

Ayrıca, muhtemelen "!" config.go dosyasında config.debug.go değil; ve muhtemelen bir tanesinin "DEBUG = false" olmasını istersiniz.

+0

yup teşekkürler, sorun buydu; Düzenlenen soru daha az aptal olmak. – Doug

13

Bunun için zaman sabitlerini derlemek kullanabilirsiniz: Eğer

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

paket borusundan değişken DEBUG dize "EVET" olarak ayarlanacaktır ile derlenmesini edin. Aksi takdirde beyan edilen içeriğini tutar.

package main 

import (
    "fmt" 
) 

var DEBUG = "NO" 

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

Düzenleme: (?) Go 1.6 anahtarı (= olmadan) o -X main.DEBUG YES önce o, -X main.DEBUG=YES beri. @poorva'dan bir yorum için teşekkür ederiz.

+1

Dize olmayan veriler için bu mümkün mü? –

+0

@MattJoiner her şeyi test etmedi, ancak ints ile mümkündür. – mschuett

+0

komutu şimdi - 'build build -ldflags '-X main.DEBUG = YES' test.go' – poorva