Edited at

Goでビルドが遅くなってきたらやってること

More than 1 year has passed since last update.

自分のプロジェクトでビルドの速度低下が問題になりつつあったので、原因になっていそうなライブラリを事前にビルドして、$GOPATH/pkgにアーカイブをインストールしたら、ビルドが速くなったので大変ありがたかったというお話です。


やること

go build に -i を付けてビルドする。ただそれだけです。

そこそこのコード量があるgithub.com/aws/aws-sdk-goを利用する自前のコードがあったので、こちらで試してみます。


まずはフルビルドしてみる

まずは -a 付けてフルビルドすると、どれくらいかかるか見てみます。

$ time go build -a ./main.go

go build -a ./main.go 28.13s user 4.30s system 223% cpu 14.517 total

30秒 近くかかりました。


一部のライブラリを事前にインストールしてからビルド

awsのライブラリを指定して -i 付きで先にビルドとアーカイブのインストールを実行しておきます。

$ go build -i ./vendor/github.com/aws/...

# インストールされてるか確認
$ ls $GOPATH/pkg/darwin_amd64/github.com/kai-zoa/d4aws/vendor/github.com/aws/aws-sdk-go/service
acm.a cloudsearch.a cognitosync.a ecs.a health.a ...

それでは -a を付けずにビルドしてみると、

$ time go build ./main.go

go build ./main.go 1.86s user 0.33s system 135% cpu 1.615 total

2秒未満っ、とても速い!(当然ですが)


インストール済みアーカイブの削除

そして、アーカイブを消したい場合は go clean -i で消せます。

$ go clean -i ./vendor/github.com/aws/...


-installsuffixをつけてビルドしているときは‥

アーカイブのビルド時も-installsuffixをつけてください。アーカイブのインストール先は$GOPATH/pkg/$GOOS_$GOARCH[_installsuffix]になるので、本体のビルド時とサフィックスを揃えないとアーカイブを探すパスが異なってしまい、せっかくの事前ビルドも意味がないです。

揃っていれば問題なし。

$ go build -i -installsuffix foo ./vendor/github.com/pkg/errors/...

$ go build -i -installsuffix foo ./main.go


詳しくはgo build -x

上記で、go build や go clean が何をしているか、アーカイブがインストールされているときは実際にビルドが省略されているのかを詳しく見てみたい人は -x を付けて実行してみてください。

実際にgoコマンドが実行する内部のコマンドが全て出力されるので、読むと勉強になります。