2
3

ビルドタグとは

ビルドタグとは、Goファイルの先頭にある特別なコメント。ビルドタグの後には1行の空行が入る。Build Constraints とも呼ばれる。ちなみに、//goの間にスペースを入れると普通のコメントとみなされる。

//go:build foo

package hoge

Go1.17以前では //go:build ではなく、 //+buildが使えわれていました。

なんのためにビルドタグを使うのか

以下のようにすると、cgoが有効な場合にのみソースファイルを含む。

//go:build cgo

ビルドオプションの指定

例えば、以下のように windows を指定すると、windows以外ではbuildされなくなる。

//go:build windows

windows以外にもGOOSやGOARCHに指定できるアーキテクチャ、cgo、コンパイラ、goのメジャーバージョンを指定できる。例えば主な例を挙げると以下のようなものがある。

  • windows, linux, darwin
  • unix
  • ignore(その他独自のカスタムタグでも可能) : build時に無視したいとき
  • cgo : CGO_ENABLEDが1のときにbuild対象となる
  • linux
  • unix
  • darwin
  • go1.22 (マイナーバージョンは指定できない)
  • gc, gccgo
  • android, ios
  • arm,arm.5, arm.6, arm.7
  • amd64, amd64.v1, amd64.v2, amd64.v3
  • mips64x, ppc64x, wasm

go build main.goのようにテストファイルを指定して、buildしたときはビルドタグに関係なく、buildされる。

また、&&, || , !演算子が利用できる。
cgoが利用でき、linuxまたは、darwin

//go:build cgo && (linux || darwin)

テストの分類

例えば、結合テストと単体テストを分けたいとき
結合テストの対象ファイルには以下のようにビルドタグをつける。

//go:build integration

次に、結合テストで動かしたくない単体テスト対象のファイルには、!のビルドタグを指定して無効にする。

//go:build !integration

そして、テスト時にtagを指定して実行する。

go test -tags=integration -v

//go:build !integration をつけないと、go test -tags=integration とすると、タグがついていないものも実行される。

ちなみに、ビルドタグでテストをスキップした場合、どのテストがスキップされたかは出力されない。対処法としては、環境変数を使用する方法がある。

以下の例では、環境変数INTEGRATIONがtrueになっている場合は、テストをスキップする。

func Test_hoge()(t *testing.T) {
 if os.Getenv("INTEGRATION") != "true" {
  t.Skip("skipping integration test")
 }
}

参考文献

  1. Amazon.co.jp: Go言語 100Tips ありがちなミスを把握し、実装を最適化する (impress top gear) : Teiva Harsanyi, 柴田 芳樹: 本
  2. Goのビルドタグの書き方が// +buildから//go:buildに変わった理由
  3. go command - cmd/go - Go Packages
  4. go buildのオプションを調べてみた
  5. Advanced Go Build Techniques - DEV Community
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3