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