Go語(yǔ)言版本管理module以及go.sum詳解
為了確保一致性構(gòu)建,Go語(yǔ)言中引入了go.mod文件來(lái)標(biāo)記每個(gè)依賴包的版本,在構(gòu)建過程中g(shù)o命令會(huì)下載go.mod中的依賴包,下載的依賴包會(huì)緩存在本地,以便下次構(gòu)建。
在進(jìn)行g(shù)o語(yǔ)言項(xiàng)目開發(fā)的時(shí)候,會(huì)依賴3種類型的庫(kù)包:
- 內(nèi)置的標(biāo)準(zhǔn)庫(kù)包,在goroot/src目錄下,也就是我們安裝目錄的src目錄下(類似于python的bin目錄)
- 第三方庫(kù)包(git上開源的)
- 項(xiàng)目中的庫(kù)包,也就是項(xiàng)目中的其他目錄。自己調(diào)用自己寫的函數(shù)方法
生成go.mod文件
確保go版本>=1.11
在項(xiàng)目的根目錄下,執(zhí)行go mod init xxxx
xxxx為對(duì)應(yīng)的項(xiàng)目名稱。
例如:我們創(chuàng)建一個(gè)geecache的項(xiàng)目,在命令行執(zhí)行go mod init geecache
此時(shí),項(xiàng)目目錄就產(chǎn)生了go.mod
go.sum
為了解決Go module的這一安全隱患,Go開發(fā)團(tuán)隊(duì)在引入go.mod的同時(shí)也引入了go.sum文件,用于記錄每個(gè)依賴包的哈希值,在構(gòu)建時(shí),如果本地的依賴包hash值與go.sum文件中記錄得不一致,則會(huì)拒絕構(gòu)建。
- 執(zhí)行
go mod tidy
命令,會(huì)生成go.sum
文件
go.sum文件詳解
go.sum文件中每行記錄由module 名, 版本和哈希組成,并由空格分開,格式如下:
<module> <version>[/go.mod] <hash>
例如:上述go.sum
中就記錄了github.com/golang/protobuf這個(gè)依賴v1.3.3版本的哈希值:
github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
通常,每個(gè)依賴包版本會(huì)包含兩條記錄:
- 第一條為該依賴包版本整體(所有文件)的哈希值,
- 第二條僅表示該依賴包版本中
go.mod
文件的哈希值
如果該依賴包版本沒有go.mod
文件,則只有第一條記錄。如上面的例子中,v1.3.3 表示該依賴包版本整體,而v1.3.3/go.mod表示該依賴包版本中g(shù)o.mod文件。
依賴包版本中任何一個(gè)文件(包括go.mod
)改動(dòng),都會(huì)改變其整體哈希值,此處再 **額外記錄依賴包版本 **的go.mod
文件主要用于計(jì)算依賴樹時(shí)不必下載完整的依賴包版本,只根據(jù)go.mod
即可計(jì)算依賴樹。go.mod
只需要記錄直接依賴的依賴包版本,只在依賴包版本不包含go.mod
文件時(shí)候才會(huì)記錄間接依賴包版本。而go.sum
則是要記錄構(gòu)建用到的所有依賴包版本。
校驗(yàn)
假設(shè)我們拿到某項(xiàng)目的源代碼并嘗試在本地構(gòu)建,go命令會(huì)從本地緩存中查找所有go.mod
中記錄的依賴包,并計(jì)算本地依賴包的哈希值,然后與go.sum
中的記錄進(jìn)行對(duì)比,即檢測(cè)本地緩存中使用的依賴包版本是否滿足項(xiàng)目go.sum
文件的期望。
如果校驗(yàn)失敗,說(shuō)明本地緩存目錄中依賴包版本的哈希值和項(xiàng)目中go.sum
中記錄的哈希值不一致,go命令將拒絕構(gòu)建。 這就是go.sum
存在的意義,即如果不使用我期望的版本,就不能構(gòu)建。
當(dāng)校驗(yàn)失敗時(shí),有必要確認(rèn)到底是本地緩存錯(cuò)了,還是go.sum
記錄錯(cuò)了。 需要說(shuō)明的是,二者都可能出錯(cuò),本地緩存目錄中的依賴包版本有可能被有意或無(wú)意地修改過,項(xiàng)目中go.sum
中記錄的哈希值也可能被篡改過。
當(dāng)校驗(yàn)失敗時(shí),go命令傾向于相信go.sum
,因?yàn)橐粋€(gè)新的依賴包版本在被添加到go.sum
前是經(jīng)過GOSUMDB(校驗(yàn)和數(shù)據(jù)庫(kù))驗(yàn)證過的。此時(shí)即便系統(tǒng)中配置了GOSUMDB(校驗(yàn)和數(shù)據(jù)庫(kù)),go命令也不會(huì)查詢?cè)摂?shù)據(jù)庫(kù)。
校驗(yàn)和數(shù)據(jù)庫(kù)
環(huán)境變量GOSUMDB
標(biāo)識(shí)一個(gè)checksum database
,即校驗(yàn)和數(shù)據(jù)庫(kù),實(shí)際上是一個(gè)web服務(wù)器,該服務(wù)器提供查詢依賴包版本哈希值的服務(wù)。
該數(shù)據(jù)庫(kù)中記錄了很多依賴包版本的哈希值,比如Google官方的sum.golang.org則記錄了所有的可公開獲得的依賴包版本。除了使用官方的數(shù)據(jù)庫(kù),還可以指定自行搭建的數(shù)據(jù)庫(kù),甚至干脆禁用它(export GOSUMDB=off)。
如果系統(tǒng)配置了GOSUMDB
,在依賴包版本被寫入go.sum
之前會(huì)向該數(shù)據(jù)庫(kù)查詢?cè)撘蕾嚢姹镜墓V颠M(jìn)行二次校驗(yàn),校驗(yàn)無(wú)誤后再寫入go.sum
。
如果系統(tǒng)禁用了GOSUMDB
,在依賴包版本被寫入go.sum
之前則不會(huì)進(jìn)行二次校驗(yàn),go命令會(huì)相信所有下載到的依賴包,并把其哈希值記錄到go.sum中。
到此這篇關(guān)于Go語(yǔ)言版本管理go module以及go.sum詳解的文章就介紹到這了,更多相關(guān)Go語(yǔ)言 go module go.sum內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go使用TimerController解決timer過多的問題
多路復(fù)用,實(shí)際上Go底層也是一種多路復(fù)用的思想去實(shí)現(xiàn)的timer,但是它是底層的timer,我們需要解決的問題就過多的timer問題!本文給大家介紹了Go使用TimerController解決timer過多的問題,需要的朋友可以參考下2024-12-12使用Go語(yǔ)言實(shí)現(xiàn)Yaml編碼和解碼的方法詳解
在這篇文章中,我們將介紹如何使用Go語(yǔ)言編寫代碼來(lái)實(shí)現(xiàn)Yaml編碼和解碼,文中有詳細(xì)的代碼示例供大家參考,對(duì)大家的學(xué)習(xí)和工作有一定的幫助,需要的朋友可以參考下2023-11-11Golang官方限流器time/rate的使用與實(shí)現(xiàn)詳解
限流器是后臺(tái)服務(wù)中十分重要的組件,在實(shí)際的業(yè)務(wù)場(chǎng)景中使用居多。time/rate?包基于令牌桶算法實(shí)現(xiàn)限流,本文主要為大家介紹了time/rate的使用與實(shí)現(xiàn),需要的可以參考一下2023-04-04Go語(yǔ)言實(shí)現(xiàn)IP段范圍校驗(yàn)示例
這篇文章主要介紹了Go語(yǔ)言實(shí)現(xiàn)IP段范圍校驗(yàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Go如何在HTTP請(qǐng)求中操作cookie教程詳解
這篇文章主要為大家介紹了Go如何在HTTP請(qǐng)求中操作cookie教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01Go語(yǔ)言實(shí)現(xiàn)Sm2加解密的示例代碼
本文主要介紹了Go語(yǔ)言實(shí)現(xiàn)Sm2加解密的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03golang 40行代碼實(shí)現(xiàn)通用協(xié)程池
golang協(xié)程機(jī)制很方便的解決了并發(fā)編程的問題,但是協(xié)程并不是沒有開銷的,所以也需要適當(dāng)限制一下數(shù)量。這篇文章主要介紹了golang 40行代碼實(shí)現(xiàn)通用協(xié)程池,需要的朋友可以參考下2018-08-08利用Golang實(shí)現(xiàn)TCP連接的雙向拷貝詳解
公司中遇到了一個(gè)使用golang編寫的agent程序,所以這篇文章主要給大家介紹了關(guān)于利用Go如何實(shí)現(xiàn)TCP連接的雙向拷貝的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考,下面隨著小編來(lái)一起看看吧。2017-09-09