1. 程式人生 > 實用技巧 >verifying module: xxx: initializing sumdb.Client: reading tree note: malformed note 解決方案

verifying module: xxx: initializing sumdb.Client: reading tree note: malformed note 解決方案

Golang verifying module: xxx: initializing sumdb.Client: reading tree note: malformed note 解決方案


問題描述

在使用 go mod 拉取github上的一些包時碰到了一個非常令人頭疼的問題,想使用一個包卻拉不下來報了以下錯誤:

go: finding module for package github.com/gin-gonic/gin
go: downloading github.com/gin-gonic/gin v1.6.3
hello.go:4:8: github.com/gin-gonic/[email protected]: verifying module: github.com/gin-gonic/[email protected]: initializing sumdb.Client: reading tree note: malformed note
note:
go.sum database tree
1353790
AVGYxnGGs0MvNF8Cz1JeGnh+z+DibzwwAxszDkhl+g4=

— sum.golang.org Az3gri/j25iP5oWam/FLqOhVMy9zUpIZ004fCG8UxXhnuYAIFhacZYBl/4hhTihVsDxC64ynGws6jcIAxj4B6df/sgI=

這是個啥錯誤呢?中文翻譯過來就是 sumdb 校驗異常
然就這個坑,卻困擾了我一下午......

解決方案

先給出解決方案吧

go env -w GOSUMDB=off

問題分析

為啥會有上面那個異常呢,咱們列印一下環境變數來看一看究竟。

$ go env
set GO111MODULE=on
set GOARCH=amd64
set GOBIN=
set GOCACHE=D:\Go\cache
set GOENV=C:\Users\zhengguanghui\AppData\Roaming\go\env
set GOEXE=.exe
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOINSECURE=
set GONOPROXY=
set GONOSUMDB=
set GOOS=windows
set GOPATH=E:\workspace\Go
set GOPRIVATE=
set GOPROXY=https://goproxy.io,direct
set GOROOT=D:\Go
set GOSUMDB=sum.golang.org
set GOTMPDIR=
set GOTOOLDIR=D:\Go\pkg\tool\windows_amd64
...

這個錯誤彷彿與 set GOSUMDB=sum.golang.org 這個脫不了干係,本著深挖到底的決心,古狗一下這個引數是用來幹啥使的,哦 某位知友已經給出了答案:

GOSUMDB(go checksum database)是Go官方為了go modules安全考慮,設定的module校驗資料庫,伺服器地址為:sum.golang.org

你在本地對依賴進行變動(更新/新增)操作時,Go 會自動去這個伺服器進行資料校驗,保證你下的這個程式碼庫和世界上其他人下的程式碼庫是一樣的。

和go.mod一樣,Go 會幫我們維護一個名為go.sum的檔案,它包含了對依賴包進行計算得到的校驗值

環境變數GOSUMDB可以用來配置你使用哪個校驗伺服器和公鑰來做依賴包的校驗

Go1.13 中當設定了 GOPROXY="https://proxy.golang.org" 時 GOSUMDB 預設指向 "sum.golang.org",其他情況預設都是關閉的狀態。如果設定了 GOSUMDB 為 “off” 或者使用 go get 的時候啟用了-insecure引數,Go 不會去對下載的依賴包做安全校驗,存在一定的安全隱患

所以在本地使用的時候可以把這個環境變數關掉,保證包能正常拉下來。