2.

Goのgo mod tidyの使い方|go.mod/go.sumを整理する依存管理コマンド

編集

go mod tidyは、Go言語のモジュール管理において、ソースコードが実際に使用している依存関係に合わせてgo.modファイルとgo.sumファイルを整理するコマンドです。コード内のimport文を走査し、必要なのに記載されていない依存(require)を追加し、どこからも使われていない不要な依存を削除して、go.sumのチェックサムを過不足のない状態に更新します。

この記事の要点
  • go mod tidyは、実際にコードが使っている依存に合わせてgo.modgo.sumを整理するコマンドです。
  • 足りない依存(require)を追加し、使われていない依存を削除し、go.sumのチェックサムを更新します。
  • 実行は通常、モジュールのルート(go.modがある場所)で go mod tidy と打つだけです。
  • 典型的な実行タイミングは、importを追加・削除した後や、変更をコミットする前です。
  • 依存の取得が必要になるため、原則としてネットワーク接続(またはモジュールキャッシュ/プロキシ)が前提になります。

go mod tidyとは

go mod tidyは、Goの公式ツールチェーンに含まれるgo modサブコマンドの1つで、モジュールの依存定義を「ソースコードの実態」と一致させるためのコマンドです。具体的には、モジュール内のすべてのパッケージ(テストファイルを含む)のimportを解析し、次の3つの整理を行います。

  • 不足している依存の追加: コードが参照しているのにgo.modrequireに記載されていないモジュールを追加します。
  • 不要な依存の削除: requireに書かれているが、ビルドにもテストにも使われていないモジュールを削除します。
  • go.sumの整理: ビルドに必要なチェックサムを追加し、不要になったエントリを取り除いてgo.sumを更新します。

結果として、go.modgo.sumは「過不足のない、再現性のある依存リスト」になります。手作業でgo.modを編集するよりも、このコマンドに整理を任せるのが一般的な運用とされています。

前提となるGo Modulesの概要

go mod tidyを理解するには、Goの依存管理の仕組みであるGo Modules(モジュール)の基本を押さえておくと役立ちます。1つのモジュールは、ルートに置かれたgo.modファイルによって定義されます。

ファイル 役割
go.mod モジュール名(モジュールパス)、対応するGoのバージョン、依存モジュールとそのバージョン(require)などを定義するファイル。依存の「定義」を担います。
go.sum 各依存モジュールの内容に対するチェックサム(ハッシュ値)を記録するファイル。取得したモジュールが改ざんされていないかを検証する用途で使われます。依存の「検証」を担います。

典型的なgo.modは、おおむね次のような内容になります(バージョン番号は一例です)。

module example.com/myapp

go 1.22

require (

    github.com/some/dependency v1.4.0

)

ソースコードに新しいimportを書いたり、逆に使わなくなったimportを消したりすると、このgo.modgo.sumと実態にズレが生じることがあります。そのズレを解消するのがgo mod tidyの主な役目です。

使い方と実行タイミング

基本的な使い方は単純で、go.modが存在するモジュールのルートディレクトリで、次のコマンドを実行します。

go mod tidy

処理の内容を詳しく確認したい場合は、-vフラグを付けると、削除された依存などの情報が標準エラー出力に表示されます。

go mod tidy -v

実行する代表的なタイミングとしては、次のような場面が挙げられます。

  • 新しいパッケージをimportしてコードを書いた後(必要な依存をgo.modに反映させる)。
  • 不要になったimportを削除した後(使われなくなった依存を整理する)。
  • 依存のバージョンを変更した後や、go getで依存を更新した後。
  • 変更をコミットする前(整理されたgo.modgo.sumを一緒にコミットしておくと、他の開発者や継続的インテグレーション環境でも同じ状態を再現しやすくなります)。

多くのプロジェクトでは、go.modgo.sumをバージョン管理に含めることが推奨されています。go mod tidyを実行した結果これらのファイルに差分が出た場合は、その差分も合わせてコミットするのが一般的な運用です。

go mod tidyを実行すると何が起きるか

コマンドを実行すると、おおむね次のような変更がgo.modgo.sumに対して行われます。

  • 必要なrequireの追加: コードが使っているのに記載されていなかった依存モジュールがrequireに追加されます。間接的に必要となる依存(推移的依存)も解決されます。
  • 不要なrequireの削除: どのパッケージからも使われていない依存がrequireから取り除かれます。
  • go.sumの更新: 追加された依存のチェックサムが書き込まれ、不要になったエントリは削除されます。これによりgo.sumが現状の依存と一致した状態になります。

なお、テスト専用に必要なモジュールなど、直接のrequireとして残しつつ間接依存であることを示すために、go mod tidyが一部の依存に// indirectというコメントを付けてgo.modに記載することがあります。これは正常な動作で、整理の結果として現れるものです。

典型的な作業の流れの例

実際の開発では、go mod tidyは単独で使うよりも、他のコマンドと組み合わせて一連の流れの中で実行することが多くなります。たとえば、新しい外部パッケージを使い始めるときは、次のような手順が考えられます。

# 1. コード内で新しいパッケージを import して保存する

# 2. 依存を go.mod に反映し、整理する

go mod tidy

# 3. ビルドやテストで動作を確認する

go build ./...

go test ./...

このように、importを変更したらgo mod tidyで依存を整え、その上でビルドやテストを回す、という順番にしておくと、依存の過不足によるビルドエラーに悩まされにくくなります。継続的インテグレーション(CI)の中でgo mod tidyを実行し、その結果go.modgo.sumに差分が出ないかをチェックして、整理漏れを検出する運用が採用されることもあります。差分が出た場合は整理が済んでいないと判断できるため、コミット前の確認手段として役立ちます。

関連コマンドの比較

go mod tidyは依存管理コマンド群の1つです。混同しやすい近いコマンドとの違いを整理すると、次のようになります。

コマンド 主な役割 go.modの書き換え
go mod tidy コードの実態に合わせて依存を追加・削除し、go.modgo.sumを整理する。 あり
go mod download go.modに記載された依存モジュールをローカルのモジュールキャッシュにダウンロードする。 原則なし
go mod verify ダウンロード済みの依存がgo.sumのチェックサムと一致し、改ざんされていないかを検証する。 なし
go get 指定したモジュールを依存として追加したり、バージョンを更新したりする。go.modrequireを書き換える。 あり

大まかには、go getが「特定の依存を入れる・上げる」ための操作であるのに対し、go mod tidyは「モジュール全体の依存リストをコードに合わせて整える」ための操作、という役割分担で捉えると整理しやすいでしょう。

落とし穴・注意点

ネットワーク接続が前提になりやすい
go mod tidyは不足している依存の解決のためにモジュール情報を取得することがあり、その場合はネットワーク接続、またはモジュールキャッシュやモジュールプロキシへのアクセスが必要です。オフライン環境では、必要なモジュールがキャッシュに無いと失敗することがあります。
go.modのバージョン指定で挙動が変わる
go.modgoディレクティブに記載されたバージョンによって、go mod tidyが生成するgo.modgo.sumの内容や、間接依存の記載方法が異なる場合があります。互換性を保つために特定の挙動で整理したい場合は、-compatフラグで対象バージョンを指定できます。チーム内では使用するGoのバージョンをそろえておくと、不要な差分が出にくくなります。
予期しない差分がコミットに混ざることがある
手元と他の開発者で実行結果が食い違うと、go.modgo.sumに細かな差分が繰り返し発生することがあります。実行後は差分の内容を確認し、意図しない依存の追加・削除が含まれていないかを確かめてからコミットすると安全です。

よくある質問(FAQ)

Q1. go mod tidyは依存を勝手にアップグレードしますか?

A. go mod tidyの主目的は依存の「整理」であり、すでに解決済みのバージョンを最新へ引き上げるための操作ではありません。バージョンを更新したい場合はgo getなどを使うのが一般的です。ただし、不足している依存を解決する過程で必要なバージョンが選ばれることはあるため、実行後の差分は確認しておくとよいでしょう。

Q2. 「go.sumが不足している」というエラーが出たときに役立ちますか?

A. go.sumに必要なチェックサムが足りない状態でビルドが失敗する場合、go mod tidyを実行すると不足分が追加され、解消されることがあります。go.sumgo.modの整合をとる手段として有効です。

Q3. go mod tidyとgo buildはどちらを先に実行すべきですか?

A. 一般的には、importを変更した後にまずgo mod tidyで依存を整理し、その上でgo buildgo testを実行する流れがわかりやすい運用です。これにより、ビルド時に依存の過不足で戸惑う場面を減らせます。

Q4. go mod tidyで依存が消えてしまいました。問題はありますか?

A. go mod tidyがある依存をrequireから削除したということは、現在のコードのどこからもその依存が使われていないと判定されたことを意味します。意図せず削除された場合は、対象のパッケージを実際にimportしているコードがあるか、あるいはテストファイルなど特定の条件下でのみ使われていないかを確認するとよいでしょう。ビルドタグなどによって特定の環境でのみ参照されるコードがある場合、その環境を考慮しないと依存が外れて見えることがあります。

Q5. go.modを手で編集するのと、go mod tidyに任せるのはどちらがよいですか?

A. 細かな調整のためにgo.modを直接編集することもできますが、requireの過不足やgo.sumの整合まで含めて正しく保つのは手作業では負担が大きくなりがちです。日常的な依存の整理はgo mod tidyのようなコマンドに任せ、必要なときだけ手で調整するという使い分けが扱いやすい方法です。

まとめ

go mod tidyは、Goのソースコードが実際に使っている依存に合わせてgo.modgo.sumを整理する、Go Modules運用の基本コマンドです。不足している依存を追加し、不要な依存を削除し、チェックサムを更新することで、依存リストを過不足のない再現性のある状態に保ちます。importの追加・削除を行った後やコミット前に実行する習慣をつけておくと、依存まわりの管理がシンプルになります。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. go mod init
  2. go mod tidy
  3. go mod download
  4. go build
  5. go_package
  6. protoc

最近更新/作成されたページ