Go依存関係バンプの説明
バンドルされたツールにはGo 1.22以降と、--base用のgitが必要です。各リビジョンでgo mod graphとgo list -m -mod=readonly -json allを実行します(GOWORK=off)。これらはモジュールとその依存関係のgo.modファイルを読み取ります。コードのビルドや実行は行わず、go.modやgo.sumを変更しません。
1. 2つのリビジョンを選択する
- Pull Requestでは、古い側はマージベースです:
git merge-base origin/main HEAD。ユーザーが明示的に求めた場合のみブランチ名を使用します。 --base REFはgit archiveでそのコミットのgo.modとgo.sumファイルを読み取るため、ワークツリーの未コミットの変更が新しい側になります。2つのチェックアウトを比較するには--old DIR --new DIRを使用します。- モジュールルート(
go.modがあるディレクトリ)で実行するか、--new MODULE_DIRを渡します。複数のモジュールがあるリポジトリでは、go.modが変更されたモジュールごとに1回実行します。
2. 実行する
go run "${CLAUDE_PLUGIN_ROOT}/scripts/whybumped.go" --base "$(git merge-base origin/main HEAD)" --new MODULE_DIR
- Pull Requestが意図した変更内容を述べている場合(例:「Bump google.golang.org/grpc from 1.63.2 to 1.67.1」のようなDependabotのタイトル)、
--expect google.golang.org/[email protected]を渡します。すると、その他の変更はすべてWARNとして報告されます(go.modが自動的に引き上げたモジュールも含む)。 --format jsonを追加して結果を解析します。- 依存関係はモジュールキャッシュ内にあるか、環境のモジュールプロキシからダウンロード可能である必要があります。ユーザーが明示的に求めない限り、
GOPROXY、GOFLAGS、GONOSUMDBを変更しないでください。
終了コード
0:WARNなし(または--fail-on never)。1:少なくとも1つのWARN。2:結果を信頼できない:いずれかの側のgo.modがない、空、切り詰められている、go.modではない、goディレクティブがない;go mod graphまたはgo list -mが失敗した(多くの場合、go.sumエントリの欠落、不明なバージョン、ネットワークなし);それらの出力が一致しない;2つの側が異なるモジュールである;一方の側に依存関係がまったくない;または--base refが存在しない。2は不明として扱い、決して合格と見なさず、ユーザーにエラーを表示します。
レポート
go-raisedがあれば最初に表示します:古いgo行と新しいgo行、新しいバージョンを必要とする依存関係とそれがグラフにどのように入ったか。go.modが必要なバージョンよりさらに上がった場合はその旨を記載します。- モジュールの変更を「pulled in through」行でグループ化します:
go.modが要求する各ルートモジュールについて、それが昇格または追加したものをリストします。これらはそのアップグレードの副作用です。 requestedの変更は、go.modだけが要求するバージョンです。どの依存関係も必要としない// indirectモジュールが必要以上に引き上げられた場合は、手動またはgo get -uで引き上げられたこと、ユーザーがより小さな変更を望む場合は必要なバージョンに留めておけることを記載します。loweredとremovedの変更は、どの要求元が古いバージョンを必要としていたか、その要求元がどこに行ったかを示します。loweredはビルド内でのダウングレードです;そのまま記載します。requirement-droppedは、go.modの行が削除されたが、別のモジュールを通じてビルドは同じバージョンを維持していることを意味します。go mod tidyは、モジュールを必要とするパッケージがなくなったときにこれを行います。ユーザーがtidyを実行していない場合は、go.modが破損していないか確認します。- 選択されていないバージョンを経由するチェーンは実際のものです:最小バージョン選択では、グラフ内のすべてのバージョンの要件がカウントされます(新しいバージョンに負けたものでも)。
- ユーザーが明示的に要求しない限り、
go.modを編集しないでください。ユーザーがより小さな変更を望む場合、通常の修正はルートモジュールに対してのみgo get module@versionを実行し、その後go mod tidyを実行して、ツールを再度実行することです。