ビルドタグとは
ビルドタグとは、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")
}
}
ショートモード
ショートモードを使うと実行速度でテストを分類することができる。
func TestLongRunning(t *testing.T) {
if testing.Short() {
t.Skip("skipping long-running test")
}
// ...
}
testing.Short
を用いるとテスト実行中にショートモードが有効になっているか否かを取得し、Skip
でスキップする。
テストの実行は-short
を渡す。
go test -short -v .