背景
Goは環境固有の処理を書ける仕組みがあり、OSやCPUアーキテクチャによってビルドするファイルを選択できます。そしてbuild tagsをビルドパラメータに与えることで、任意の条件でビルドするファイルを切り替えることができます。この方法はcgoのincludeなど、ビルド時に解決したい依存関係があるときに有用です。
ビルドスクリプト
build tagはgo build
に-tags
オプションで渡すことができます。2つのビルドで異なるバイナリを吐くようにGoを記述します。
go build -tags foo # fooサポート環境
go build # foo非サポート環境
この方法は、例えばファイル/usr/include/foo.h
の有無でビルドを切り替えることができます。
if [ -f /usr/include/foo.h ]; then
go build -tags foo
else
go build
fi
build tagsを使ったビルドの切り分け
Goのコードの先頭にビルドタグ// +build
をつけるとこで、そのファイルをビルド対象かどうかを指定できます。foo
が与えられた時とそうでない時のファイルを用意し、それぞれのファイルの先頭にビルド条件を記述します。
run_foo.go
// +build foo
package main
import "fmt"
func run() {
fmt.Println("Foo supported")
}
run_nofoo.go
// +build !foo
package main
import "fmt"
func run() {
fmt.Println("Foo not supported")
}
そしてmainからrun()
を呼び出すと、ビルドされたどちらかのrun()
を呼び出します。
package main
func main() {
run()
}