首頁 > 軟體

執行go vendor第三方包版本衝突問題解決

2022-07-15 18:00:36

問題症狀

我們使用 jenkins 指令碼執行 go build ,用來構建線上伺服器使用的二進位制檔案。構建過程中有這樣一個步驟:

go mod vendor

該步驟將以 go.mod 檔案中寫明的包和版本為準下載第三方依賴並儲存到原生的 vendor 目錄。下載過程中將校驗 go.sum 中的 hash 值是否同檔案 hash 一致。

在實際執行中,遇到這樣的錯誤:

internal error: failed to find embedded files of github.com/marten-seemann/qtls-go1-18: //go:build comment without // +build comment

排查經過

通過 qtls-go1-18 的倉庫名可以觀察到問題可能跟 go 1.18 的版本有關。

開啟依賴的 github 倉庫可見簡介:

Go standard library TLS 1.3 implementation, modified for QUIC. For Go 1.18.

而我們構建的環境 go env 輸出的版本為 1.16

在 go 1.18 的 release notes 中查詢相關資訊:

//go:build lines
Go 1.17 introduced //go:build lines as a more readable way to write build constraints, instead of // +build lines. As of Go 1.17, gofmt adds //go:build lines to match existing +build lines and keeps them in sync, while go vet diagnoses when they are out of sync.

Since the release of Go 1.18 marks the end of support for Go 1.16, all supported versions of Go now understand //go:build lines. In Go 1.18, go fix now removes the now-obsolete // +build lines in modules declaring go 1.18 or later in their go.mod files.

報錯的意思是 //go:build (1.18 版本支援) 必須同 // +build 一起出現。至此確認問題原因。

解決辦法

業務程式碼並沒有直接用到 qtls 包,且並沒有直接依賴 qtls-go1-18 對應的 go 版本。此庫為非直接依賴引入的,需要找出是那個包引入了這個依賴。

go mod why github.com/marten-seemann/qtls-go1-18

可以檢視是誰引入該依賴。從輸出可以看到:

# github.com/marten-seemann/qtls-go1-18
git.mycompany.com/group/projecta
git.mycompany.com/group/projectb
github.com/smallnest/rpcx/client
github.com/lucas-clemente/quic-go
github.com/marten-seemann/qtls-go1-18

通過 go mod graph 可以看到具體那個包的那個版本引入的

最終確認是 quic-go 的 0.27 引入的。

在 go.mod 中排除掉 quic-go 0.27 即可。在 go.mod 中加一行。

exclude lucas-clemente/quic-go v0.27.0

總結和其他

  • 為什麼 go mod vendor 會更新版本,理論上只會使用 go.mod 中制定的版本;
  • build 機器不需要 go mod vendor ,直接 go mod download 即可;
  • go mod vendor 同 go mod download 在依賴管理上有什麼不同?

以上就是執行go vendor第三方包版本衝突問題解決的詳細內容,更多關於go vendor版本衝突的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com