概要
個人的にGolangを学習している中でgo.mod
ファイルとgo.sum
ファイルについて自分なりに調査をしてみたので備忘録として書き残します。
環境
今回はGoのバージョン1.20
を想定してます。
go.modとは
go.mod
ファイルは使用されるモジュールの依存関係を管理するファイルです。
プロジェクトを新規で始める際にgo mod init <モジュールパス>
を実行すると作成されるファイルです
例えば、go mod init sample/app
と入力すると下記のようなgo.mod
ファイルが生成されます。
module sample/app
go 1.20
今後モジュールをgo mod tidy
などでインストールする場合はここに記載されていきます。
試しにGinをインストールしてみましょう。
module github.com/soicchi/chatapp_backend
go 1.20
require github.com/gin-gonic/gin v1.8.2
require (
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/go-playground/locales v0.14.0 // indirect
github.com/go-playground/universal-translator v0.18.0 // indirect
github.com/go-playground/validator/v10 v10.11.1 // indirect
github.com/goccy/go-json v0.9.11 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/leodido/go-urn v1.2.1 // indirect
github.com/mattn/go-isatty v0.0.16 // indirect
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pelletier/go-toml/v2 v2.0.6 // indirect
github.com/ugorji/go/codec v1.2.7 // indirect
golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3 // indirect
golang.org/x/net v0.4.0 // indirect
golang.org/x/sys v0.3.0 // indirect
golang.org/x/text v0.5.0 // indirect
google.golang.org/protobuf v1.28.1 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
)
上記のようにインストールされるモジュールとそのバージョンを管理してくれます。
go mod tidyとは(補足)
先ほど出てきたgo mod tidyコマンドは、ソースコードを参照してgo.mod
ファイルに記載されているモジュールとの整合性を見てくれるコマンドです。したがってソースコードでimportされているのにもかかわらず、インストールされてない場合、つまりgo.mod
に記載されていない場合に自動的に該当モジュールをインストールしてくれます。また、ソースコードで使用されていないモジュールがgo.mod
に記載されている場合、自動的に削除してくれます。そしてそれらの情報をgo.sum
に記載します。(go.sum
ファイルの詳細については後述)
つまりまとめると下記のようになります。
- go.modファイルがソースコードと整合性あるかを確認する
- ビルドするために必要なモジュールを追加・削除する
- 上記の情報をgo.sumへ記載する
go.sumとは
go.sum
ファイルは先ほど説明したgo.mod
ファイル内のモジュールの依存関係をハッシュ化したものを保存するファイルです。このファイルはgo.modファイル同様にビルドする際に使用されます。なぜ、わざわざハッシュ化して保存するのでしょうか。確かにgo.sum
ファイルがなくてもビルドすることができます。それはgo.mod
との整合性を図り、一貫性と信頼性を担保するために必要なようです。
ではファイルの中身はどのようになっているのでしょうか。
先ほどginをインストールした際のgo.sum
ファイルです。
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
github.com/gin-gonic/gin v1.8.2 h1:UzKToD9/PoFj/V4rvlKqTRKnQYyz8Sc1MJlv4JHPtvY=
github.com/gin-gonic/gin v1.8.2/go.mod h1:qw5AYuDrzRTnhvusDsrov+fDIxp9Dleuu12h8nfB398=
.......省略
まとめ
今回はGoで開発する際の基礎的な部分のご説明でした。
普段インタプリタ言語しかやっていない私にとってこれからGoを学べることにワクワクしています。
これから日々の学びをアウトプットしていこうと思います!
最後まで読んでいただいてありがとうございました。