🐁
Goのbuild時の依存関係ってどうなっているの?
はじめに
最近モノレポって楽だなあと思ってプロジェクトを作ることが多いです。
ただ、モノレポで管理するにしてもgo.mod
ってどうやって管理すればいいのだろうとふと気になりました。
Lambda
コードをモノレポで管理するときに関数ごとにgo mod init xxx
を実行して関数ごとにgo.mod
を作って大変だなと思いました。
ビルドしたバイナリには実装に含まれなくてもgo.mod
で適応しているライブラリが含まれてしまうと思い込んでいたのでちょっと手を動かして確認してみました。
ひとつのgo.modでふたつのビルド
わかりやすそうなものとしてロギングライブラリをひとつのgo.mod
に追加して
それぞれを使ったmain.go
を実装してビルドしてみました。
それぞれ実装はこんな感じです。レベル別にとりあえずロギングしてみました。
気になる結果は
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