標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

ビルドタグは import 先にまで派生する

まぁ、当たり前の話ではあるんだけど、github.com/zetamatta/go-windows-dbg を改造するにあたって大丈夫か?とちょっと不安になったので、念のため検証。

サブパッケージ(bar)は release タグの有無で挙動が変わる。タグを指定するのはメインパッケージ(main=foo)となる。

github.com/zetamatta/bar/main.go

サブパッケージ。タグ release が設定されていない時だけ有効

// +build !release

package bar

func Run() {
    println("not release")
}

github.com/zetamatta/bar/main_release.go

サブパッケージ。タグ release が設定されている時だけ有効

// +build release

package bar

func Run() {
    println("release")
}

github.com/zetamatta/foo/main.go

メインパッケージ。ここのビルド時にタグを指定する

package main

import (
    "github.com/zetamatta/bar"
)

func main(){
    bar.Run()
}

実験

<~/go/src/github.com/zetamatta/foo>
$ go build && foo
not release
<:~/go/src/github.com/zetamatta/foo>
$ go build -tags=release && foo
release

よしよし

複数のビルドタグによる条件ビルドの構文

によると

  • AND はタグを , (カンマ)区切りでならべるか、次の行に +build 行を追加
  • OR はタグを空白区切りでならべる
  • 結合の強さは , > 空白 >改行

(例)

  • // +build !ndebug,windows
    ! defined(ndebug) && defined(windows) に相当

  • // +build !windows ndebug
    ! defined(windows) || defined(ndebug) に相当

なるほど!