31

さまざまなバージョンのgoアプリケーションを構築できる必要があります。「デバッグ」バージョンと通常バージョン。

これは簡単です。アプリケーションの動作を制御するconstDEBUGがあるだけですが、ビルドタイプを交換する必要があるたびに構成ファイルを編集する必要があるのは面倒です。

私はgobuild(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:このブロック(<0>)で再宣言されたDEBUG src / build /config.debug.go:3での以前の宣言

私は何が間違っているのですか?

私が使用すべきこれを行うための別のより適切な#ifdefスタイルの方法はありますか?

4

3 に答える 3

30

別の質問に対する私の答えを参照してください。行の後に空白行が必要です// +build

また、!config.debug.goではなくconfig.goに含める必要があります。おそらく、「DEBUG=false」にする必要があります。

于 2013-03-05T02:03:16.793 に答える
23

そのためにコンパイル時定数を使用できます。プログラムを次のようにコンパイルする場合

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

パッケージmainの変数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からのコメントに感謝します。

于 2013-03-05T07:04:59.630 に答える
3

Go 1.17以降、ビルドタグは新しい//go:build構文で指定できます。

//go:buildディレクティブの配置に関しては、新しいデザインは次のように述べています。

制約は、(Goだけでなく)あらゆる種類のソースファイルに表示される可能性がありますが、ファイルの先頭近くに表示され、その前に空白行やその他のコメントのみが表示される必要が//あり/* */ます。これらのルールは、Goファイルでは、パッケージ句の前にビルド制約を表示する必要があることを意味します。

//go:buildしたがって、ディレクティブとパッケージステートメントの間に空白行を残す必要があります。そうしないと、パッケージドキュメントとして解析される可能性がありますが、次のようになります。

  • コンパイラは、誤って配置されたディレクティブを拒否します
  • 実行go fmtすると、誤って配置されたディレクティブが自動的に修正されます

たとえば、実行go fmt中(空白行なし):

//go:build foo
package main

import "fmt"

func main() {
    fmt.Println("Hello world")
}

与える(空白行付き):

//go:build foo

package main

import "fmt"

func main() {
    fmt.Println("Hello world")
}

新しい構文で何が変わるかについての詳細は、この回答も参照してください。

于 2021-06-12T08:07:05.710 に答える