🐁

Goのbuild時の依存関係ってどうなっているの?

2022/09/29に公開

はじめに

最近モノレポって楽だなあと思ってプロジェクトを作ることが多いです。
ただ、モノレポで管理するにしてもgo.modってどうやって管理すればいいのだろうとふと気になりました。
Lambdaコードをモノレポで管理するときに関数ごとにgo mod init xxxを実行して関数ごとにgo.modを作って大変だなと思いました。
ビルドしたバイナリには実装に含まれなくてもgo.modで適応しているライブラリが含まれてしまうと思い込んでいたのでちょっと手を動かして確認してみました。

ひとつのgo.modでふたつのビルド

わかりやすそうなものとしてロギングライブラリをひとつのgo.modに追加して
それぞれを使ったmain.goを実装してビルドしてみました。

https://github.com/uber-go/zap/

https://github.com/takokun778/fs-go-module/blob/main/zap/main.go

https://github.com/rs/zerolog

https://github.com/takokun778/fs-go-module/blob/main/zerolog/main.go

それぞれ実装はこんな感じです。レベル別にとりあえずロギングしてみました。

気になる結果は

go.modは以下のようになっています。

https://github.com/takokun778/fs-go-module/blob/main/go.mod

go version -m ${binary}で依存関係を確認できるとのことで見てみました。

4.2M	zapmain
./zapmain: go1.19.1
	path	command-line-arguments
	dep	go.uber.org/atomic	v1.7.0	h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
	dep	go.uber.org/multierr	v1.6.0	h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
	dep	go.uber.org/zap	v1.23.0	h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY=
	build	-compiler=gc
	build	CGO_ENABLED=1
	build	CGO_CFLAGS=
	build	CGO_CPPFLAGS=
	build	CGO_CXXFLAGS=
	build	CGO_LDFLAGS=
	build	GOARCH=arm64
	build	GOOS=darwin
2.3M	zerologmain
./zerologmain: go1.19.1
	path	command-line-arguments
	dep	github.com/mattn/go-colorable	v0.1.12	h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=
	dep	github.com/mattn/go-isatty	v0.0.14	h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
	dep	github.com/rs/zerolog	v1.28.0	h1:MirSo27VyNi7RJYP3078AA1+Cyzd2GB66qy3aUHvsWY=
	dep	golang.org/x/sys	v0.0.0-20210927094055-39ccf1dd6fa6	h1:foEbQz/B0Oz6YIqu/69kfXPYeFQAuuMYFkjaqXzl5Wo=
	build	-compiler=gc
	build	CGO_ENABLED=1
	build	CGO_CFLAGS=
	build	CGO_CPPFLAGS=
	build	CGO_CXXFLAGS=
	build	CGO_LDFLAGS=
	build	GOARCH=arm64
	build	GOOS=darwin

実装に関係のない依存関係は含まれていないですね。
zap大きい。。。)

おわりに

go.modにあっても、実装に関係ないものはちゃんと排除されるのですね。
Goの勉強はしているつもりでしたが、こんなことも知らずにまだまだ未熟者でした。
もっともっとGoについて知ろうと思います!

Discussion