2013-03-05 6 views
22

Мне нужно иметь возможность создавать разные версии приложения go; версия отладки и обычная версия.Как правильно использовать теги сборки?

Это легко сделать; У меня просто есть константа 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

yup thanks, в этом была проблема; отредактированный вопрос был менее глупым. – Doug

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) 
} 

Edit: так как Go 1.6 переключатель -X main.DEBUG=YES, до того, что он был -X main.DEBUG YES (без =) (?). Благодаря комментарию от @poorva.

+1

Возможно ли это для нестроковых данных? –

+0

@MattJoiner не тестировал все, но это возможно с помощью ints. – mschuett

+0

команда теперь изменена на - 'go build -ldflags '-X main.DEBUG = YES' test.go' – poorva

Смежные вопросы