檢查 Go 版本升級
提升 go.mod 中的 go 行不僅變更語言版本。每個主要套件都會取得新版本的 GODEBUG 預設值,因此 net/http、crypto/tls、crypto/x509、net/url、runtime 等套件的行為可能會在無程式碼變更的情況下改變。此工具會呼叫已安裝的 Go 工具鏈來列出哪些預設值會改變,以及哪些二進位檔會匯入受影響的套件。它需要安裝 Go,會讀取 go.mod 但不修改它,不會建置或執行使用者的程式碼,也不會使用網路。
執行工具
從模組根目錄執行,或傳入其目錄:
go run "${CLAUDE_PLUGIN_ROOT}/scripts/godebugdiff.go" --to 1.24 .
--to預設為已安裝工具鏈的版本,且不能比它新。如果使用者想要更新的目標,請告知他們需要先安裝該 Go 版本。--from預設為目前的 go 行。如果要審查已經升級的 PR,請傳入基礎分支的版本:--from 1.21。- 加上
--json以取得結構化輸出,加上--tests以包含測試二進位檔。如果模組沒有主要套件,則會自動透過其測試二進位檔進行檢查。 - 如果工具顯示模組不在模組快取中,請在使用
go mod download前詢問使用者,因為這會使用網路。
檢查每個會影響二進位檔的變更
工具會根據讀取設定的套件來列出設定。匯入套件不代表一定會使用到受影響的程式碼路徑,因此請檢查:
- 閱讀設定的說明文句和連結。然後在程式碼中搜尋它提到的 API,例如
http.NewServeMux和HandleFunc的模式(針對httpmuxgo121)、tls.Config(針對 TLS 設定)、x509.ParseCertificate或CreateCertificate(針對 x509 設定)、以及rand.Seed(針對randseednop)。 - 針對每個設定,判斷程式碼是否使用了該路徑:已使用、未使用、或無法判斷(例如某個依賴套件呼叫了它)。
runtime的設定(例如containermaxprocs和updatemaxprocs)會影響到每個二進位檔。請指出那些對於部署方式重要的設定,例如有 CPU 限制的容器。- 以
win開頭的設定僅在 Windows 上有效。如果專案不在 Windows 上發布,請說明。 - 「變更 go 命令」下的設定會影響
go test -json或 CI 中的建置,而非程式本身。
報告
- 一個簡短表格:設定、變更內容、哪個二進位檔、以及程式碼是否使用了該路徑。
- 建議採用新的預設值,或鎖定舊的行為。僅針對程式碼真正依賴的設定建議鎖定,並使用工具的
godebug ( ... )區塊。鎖定應是暫時的:說明它們在後續的 Go 版本中會被移除。 - 傳遞工具的備註,例如 Go 1.22 的迴圈變數變更,或某個函式庫的 go 行無法為匯入它的程式設定 GODEBUG。
不準做的事
- 除非使用者要求,否則不要編輯 go.mod。
- 不要因為沒有列出任何項目就說升級是安全的。該工具僅涵蓋 GODEBUG 預設值。發行說明中會列出其他變更。
- 除非使用者要求,否則不要執行使用者的測試或二進位檔來檢查行為。