Community程式設計與開發github.com

GillMacedo/解釋 Go 相依套件版本變動

解釋 Go 模組相依版本在兩個版本之間(Git 參考或兩個目錄)變更的原因。可協助審查 Dependabot 或 Renovate 對 Go 模組提出的合併請求。

解釋 Go 相依套件版本變動 是什麼?

這個技能旨在協助開發者或 AI 代理審查 Go 模組的版本變動,特別是在處理 Dependabot 或 Renovate 自動升級 PR,或是 `go get`、`go mod tidy` 意外修改多個相依套件時。它會比較兩個版本(透過 Git 參考或目錄)的 `go.mod` 與 `go.sum`,找出所有被提升、新增、降低或移除的模組,並詳細說明每個變動的原因——哪個相依套件要求了新版、以及從 `go.mod` 到該套件的完整依賴鏈。此外,它還會報告導致 `go` 指令版本上升的相依套件。此工具支援 Linux、macOS 與 Windows,需要 Go 1.22 以上版本,並使用 `go mod graph` 與 `go list -m` 來產生報告,不會修改專案檔案。其退出碼(0:無警告,1:有警告,2:無法信任結果)可讓 CI/CD 流程輕鬆整合。

相容平台✓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 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

解釋 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. 選取兩個版本

  • 在合併請求中,舊版本是合併基礎:git merge-base origin/main HEAD。僅在使用者要求時才使用分支名稱。
  • --base REF 會透過 git archive 讀取該提交的 go.mod 和 go.sum 檔案,因此工作目錄中未提交的變更會作為新版本。請使用 --old DIR --new DIR 來比較兩個檢出目錄。
  • 在模組根目錄(含有 go.mod 的目錄)中執行,或傳遞 --new MODULE_DIR。在一個包含多個模組的儲存庫中,請為每個 go.mod 有變更的模組各執行一次。

2. 執行

go run "${CLAUDE_PLUGIN_ROOT}/scripts/whybumped.go" --base "$(git merge-base origin/main HEAD)" --new MODULE_DIR
  • 如果合併請求說明了它意圖更改的內容(例如 Dependabot 的標題「從 1.63.2 升級 google.golang.org/grpc 到 1.67.1」),請使用 --expect google.golang.org/[email protected] 傳遞。那麼其他所有變更都會被視為 WARN,包括 go.mod 自行提升的模組。
  • 加上 --format json 以解析結果。
  • 相依套件必須存在於本機模組快取中,或可從環境中的模組代理下載。除非使用者要求,否則不要更改 GOPROXY、GOFLAGS 或 GONOSUMDB。

退出碼

0 表示沒有 WARN(或使用了 --fail-on never)。1 表示至少有一個 WARN。2 表示結果不可信賴:某一方的 go.mod 缺失、為空、被截斷、並非 go.mod 檔案或沒有 go 指令;go mod graph 或 go list -m 執行失敗(通常是缺少 go.sum 條目、版本未知或沒有網路);它們的輸出不一致;兩邊是不同的模組;某一方完全沒有相依套件;或者 --base 參考不存在。請將 2 視為未知,永遠不要視為通過,並向使用者顯示錯誤資訊。

報告

  1. 如果存在,則從 go-raised 開始:顯示舊的和新的 go 版本號、需要新版 go 的相依套件以及它如何進入依賴圖。如果 go.mod 的版本升級超出了任何相依套件的需求,請說明此情況。
  2. 將模組變更按「透過...引入」分類:對於 go.mod 中每個直接要求的根模組,列出它提升或新增的模組。這些是該升級帶來的副作用。
  3. requested 變更是指只有 go.mod 直接要求的版本。對於一個被提升到超過任何相依套件所需版本的 // indirect 模組,說明它是手動提升或由 go get -u 提升,並且如果使用者希望變更範圍更小,它可以維持在所需的版本。
  4. lowered 和 removed 變更會說明是哪個依賴者曾經需要舊版本,以及該依賴者後續的變化。降低的模組表示建置版本被降級;請直接說明。
  5. requirement-dropped 表示 go.mod 中移除了某行,而建置版本透過另一個模組保留了相同的版本。當沒有任何套件需要該模組時,go mod tidy 會執行此操作。如果使用者沒有執行 tidy,請檢查 go.mod 是否受損。
  6. 透過未選中版本的依賴鏈是真實存在的:在最小版本選擇中,依賴圖中每個版本的需求都會被計入,即使是那些被較新版本取代的版本。
  7. 除非使用者要求,否則不要編輯 go.mod。如果他們希望變更範圍更小,通常的解決方法是僅對根模組執行 go get 模組@版本,然後執行 go mod tidy,再重新執行此工具。

相關技能