go mod 版本依賴問題


Go module遵循語義化版本規范 2.0.0 major.minor.patch

樣板分析

1. model path

一行是module path, 一般采用倉庫地址方式定義。這樣我們獲取一個module的時候,就可以到它的倉庫中去查詢,或者讓go proxy到倉庫中去查詢。

如果版本大於2.0.0,按照規范,需要加上major后綴,比如加上v2,v3,以便和其它major版本進行區分。

// 不同tag, module名不一樣 module githup.com/panicthis/modfile/v2
這樣 go mod 通過不同的major版本,讓他們共存,也就是識別成獨立的包

2.go directive

第二行是go directive,不是指你當前使用的Go版本,而是指名你的代碼所需要的Go的最低版本
go 1.16

3.require

require段中列出了項目所需要的各個依賴庫以及它們的版本,除了正規的v1.3.0這樣的版本外

4.incompatible

這些庫采用了go.mod的管理,但是不幸的是,雖然這些庫的版major版本已經大於等於2了,但是他們的module path中依然沒有添加v2、v3這樣的后綴。
標記為不規范,這樣不同major版本,共存也就失效了, go mod 會選擇最新版本,因為默認是新版本是兼容舊版本的。

5.包依賴沖突的問題

  1. major 特性:包同時共存。在Go中,由於采用語義導入版本機制,major版本號不同的module被視為不同的module,即使它們源於同一個repository(比如上面的源於同一個P3的v1.5和v2.0就被視為兩個不同的module)。

當然這種解決方案是有代價的!第一個代價就是構建出來的app的二進制文件size變大了,因為二進制文件中包含了多個版本的P3的代碼;第二個代價,可能也算不上代價,更多是要注意的是不同版本的module之間的類型、變量、標識符不能混用,我們以go-redis/redis這個開源項目舉個例子。go-redis/redis最新大版本為v8.11.4,沒有啟用go.mod時的版本為v6.x.x,我們將這兩個版本混用在一起。

2)歷史遺留問題,有些項目沒有使用go mod 模式,所以項目中go.mod文件,
那么不同major的包共存特性也就沒有,如果同時引用的話,那么會選擇最新的版本。

6. go mod 不允許循環依賴


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM