Communityコーディング&開発github.com

GillMacedo/explaining-go-dependency-bumps

Goモジュールの依存関係バージョン変更がなぜ発生したかを2つのリビジョン間(git refまたは2つのディレクトリ)で説明します。ビルドリストで追加・削除・昇格・降格された各モジュールについて、新しいバージョンを要求した依存関係とgo.modまでのチェーンを特定し、goディレクティブを引き上げた依存関係をリストアップします。DependabotやRenovateのGoモジュールPull Requestのレビュー時、go getやgo mod tidyが予想以上にモジュールを変更した場合、go.modのgo行が上がった場合に使用します。

explaining-go-dependency-bumps とは?

このスキルは、Goモジュールの依存関係変更を分析し、開発者に詳細な説明を提供します。具体的には、2つのリビジョン(gitリファレンスまたはディレクトリ)間で、ビルドリスト内の各モジュールについて、なぜバージョンが変更されたのかを、依存関係のチェーンを辿って説明します。これは、DependabotやRenovateが作成したPull Requestのレビューや、go get/go mod tidy実行時に予期せぬ依存関係変更が発生した場合に特に有用です。ツールは`go mod graph`と`go list -m`を実行し、コードをビルドせずにgo.modファイルのみを読み取るため安全です。レポートは、goディレクティブの変更、各直接依存関係による間接的な変更、手動による変更、ダウングレード、削除などをグループ化して明確に表示します。

対応✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/GillMacedo/whybumped/tree/HEAD/plugin/skills/explaining-go-dependency-bumps

Installed? Explore more コーディング&開発 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

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は不明として扱い、決して合格と見なさず、ユーザーにエラーを表示します。

レポート

  1. go-raisedがあれば最初に表示します:古いgo行と新しいgo行、新しいバージョンを必要とする依存関係とそれがグラフにどのように入ったか。go.modが必要なバージョンよりさらに上がった場合はその旨を記載します。
  2. モジュールの変更を「pulled in through」行でグループ化します:go.modが要求する各ルートモジュールについて、それが昇格または追加したものをリストします。これらはそのアップグレードの副作用です。
  3. requestedの変更は、go.modだけが要求するバージョンです。どの依存関係も必要としない// indirectモジュールが必要以上に引き上げられた場合は、手動またはgo get -uで引き上げられたこと、ユーザーがより小さな変更を望む場合は必要なバージョンに留めておけることを記載します。
  4. loweredとremovedの変更は、どの要求元が古いバージョンを必要としていたか、その要求元がどこに行ったかを示します。loweredはビルド内でのダウングレードです;そのまま記載します。
  5. requirement-droppedは、go.modの行が削除されたが、別のモジュールを通じてビルドは同じバージョンを維持していることを意味します。go mod tidyは、モジュールを必要とするパッケージがなくなったときにこれを行います。ユーザーがtidyを実行していない場合は、go.modが破損していないか確認します。
  6. 選択されていないバージョンを経由するチェーンは実際のものです:最小バージョン選択では、グラフ内のすべてのバージョンの要件がカウントされます(新しいバージョンに負けたものでも)。
  7. ユーザーが明示的に要求しない限り、go.modを編集しないでください。ユーザーがより小さな変更を望む場合、通常の修正はルートモジュールに対してのみgo get module@versionを実行し、その後go mod tidyを実行して、ツールを再度実行することです。

関連スキル