1. 問題
在項目上我喜歡通過
go module
做包管理,在使用的過程中會遇到各種導入包但因為版本問題無法正常使用的問題,這次遇到的問題如下:
項目中引用了 client-go
包,執行完 go mod tidy 及 go mod vendor 後,運作程式發現程式無法運作,報錯如下: cannot load k8s.io/api/auditregistration/v1alpha1…
2. 刨根問底
第一時間檢查vendor目錄下報錯資訊中的庫是否存在,發現真的不存在,于是檢視
go.mod
檔案:
require (
github.com/imdario/mergo v0.3.12 // indirect
golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba // indirect
google.golang.org/appengine v1.6.7 // indirect
k8s.io/api v0.21.0 // indirect
k8s.io/apimachinery v0.21.0
k8s.io/client-go v11.0.0+incompatible
k8s.io/klog v1.0.0 // indirect
k8s.io/utils v0.0.0-20210305010621-2afb4311ab10 // indirect
)
檢視 cleint-go v11.0.0 版本的源碼,發現這個版本并沒有使用 go module 做版本管理,在README文檔中說了下面的一句話:
We currently recommend using the v10.0.0 tag. See INSTALL.md for detailed installation instructions.works, but will build
go get k8s.io/client-go/...
, which doesn’t handle the dependencies well.
master
意思大概就是說這個版本不能很好的處理依賴項,建議使用 v10.0.0 版本,找到了産生上面報錯的根本原因了:go module 下載下傳的依賴庫與 client-go 不比對導緻,程式無法正常運作。
3. 解決問題
那就找一個穩定版本,然後手動修改 go.mod 檔案,舉例如下:
replace (
k8s.io/api => k8s.io/api v0.15.10
k8s.io/apimachinery => k8s.io/apimachinery v0.15.10
k8s.io/client-go => k8s.io/client-go v0.15.10
)
當然你也可以根據自己的需要選擇滿足自己需求的版本,隻需要更換示例中的版本号就可以了。
4. 總結
在部落格中我省略了谷歌的過程,因為在搜尋的過程中,我看到了很多部落格直接給出了修改 go.mod 來解決這個問題的辦法,但是我想知道為什麼那麼做,經過反向探索,一步步找出了産生問題的根本原因及解決辦法,這裡總結一下就是:go module 做版本管理如果報找不到依賴之類的問題,排除網絡問題後可以直接去源碼找問題,源碼的 README 文檔中一般都能找到解決思路。