Подтвердить что ты не робот

Как правильно использовать теги сборки?

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

Это легко сделать; У меня просто есть константа DEBUG, которая управляет поведением приложения, но раздражает необходимость редактировать файл конфигурации каждый раз, когда мне нужно обмениваться между типами сборки.

Я читал о go build (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/build/config.go: 3: DEBUG обновлен в этом блоке (< 0 > ) previous Объявление в src/build/config.debug.go: 3

Что я делаю неправильно?

Есть ли еще один и более подходящий способ стиля #ifdef, который я должен использовать?

4b9b3361

Ответ 1

Посмотрите мой ответ на другой вопрос. Вам понадобится пустая строка после строки "//+ build".

Кроме того, вы, вероятно, хотите "!" в config.go, а не в config.debug.go; и предположительно вы хотите, чтобы он был "DEBUG = false".

Ответ 2

Вы можете использовать константы времени компиляции для этого: если вы скомпилируете свою программу с помощью

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

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