當前位置:編程學習大全網 - 源碼下載 - go.sum工作機制

go.sum工作機制

為了確保壹致性構建,Go引入了go.mod文件來標記每個依賴包的版本,在構建過程中go命令會下載go.mod中的依賴包,下載的依賴包會緩存在本地,以便下次構建。 考慮到下載的依賴包有可能是被黑客惡意篡改的,以及緩存在本地的依賴包也有被篡改的可能,單單壹個go.mod文件並不能保證壹致性構建。

為了解決Go module的這壹安全隱患,Go開發團隊在引入go.mod的同時也引入了go.sum文件,用於記錄每個依賴包的哈希值,在構建時,如果本地的依賴包hash值與go.sum文件中記錄得不壹致,則會拒絕構建。

go.sum文件記錄

go.sum文件中每行記錄由module名、版本和哈希組成,並由空格分開:

比如,某個go.sum文件中記錄了github.com/google/uuid 這個依賴包的v1.1.2版本的哈希值:

正常情況下,每個依賴包版本會包含兩條記錄,第壹條記錄為該依賴包版本整體(所有文件)的哈希值,第二條記錄表示該依賴包版本中go.mod文件的哈希值,如果該依賴包版本沒有go.mod文件,則只有第壹條記錄。如上面的例子中,v1.1.2表示該依賴包版本整體,而v1.1.2/go.mod表示該依賴包版本中go.mod文件。

依賴包版本中任何壹個文件(包括go.mod)改動,都會改變其整體哈希值,此處再額外記錄依賴包版本的go.mod文件主要用於計算依賴樹時不必下載完整的依賴包版本,只根據go.mod即可計算依賴樹。

每條記錄中的哈希值前均有壹個表示哈希算法的h1:,表示後面的哈希值是由算法SHA-256計算出來的

go.sum文件中記錄的依賴包版本數量往往比go.mod文件中要多,這是因為二者記錄的粒度不同導致的。go.mod只需要記錄直接依賴的依賴包版本,只在依賴包版本不包含go.mod文件時候才會記錄間接依賴包版本,而go.sum則是要記錄構建用到的所有依賴包版本。

生成

當我們在GOMODULE模式下引入壹個新的依賴時,通常會使用go get命令獲取該依賴,比如:

go get命令首先會將該依賴包下載到本地緩存目錄$GOPATH/pkg/mod/cache/download,該依賴包為壹個後綴為.zip的壓縮包,如v1.0.0.zip。go get下載完成後會對該.zip包做哈希運算,並將結果存放在後綴為.ziphash的文件中,如v1.0.0.ziphash。如果在項目的根目錄中執行go get命令的話,go get會同步更新go.mod和go.sum文件,go.mod中記錄的是依賴名及其版本,如:

go.sum文件中則會記錄依賴包的哈希值(同時還有依賴包中go.mod的哈希值),如:

在更新go.sum之前,為了確保下載的依賴包是真實可靠的,go命令在下載完依賴包後還會查詢GOSUMDB環境變量所指示的服務器,以得到壹個權威的依賴包版本哈希值。如果go命令計算出的依賴包版本哈希值與GOSUMDB服務器給出的哈希值不壹致,go命令將拒絕向下執行,也不會更新go.sum文件。

go.sum存在的意義在於,希望別人或者在別的環境中構建當前項目時所使用依賴包跟go.sum中記錄的是完全壹致的,從而達到壹致構建的目的。

校驗

假設我們拿到某項目的源代碼並嘗試在本地構建,go命令會從本地緩存中查找所有go.mod中記錄的依賴包,並計算本地依賴包的哈希值,然後與go.sum中的記錄進行對比,即檢測本地緩存中使用的依賴包版本是否滿足項目go.sum文件的期望。

如果校驗失敗,說明本地緩存目錄中依賴包版本的哈希值和項目中go.sum中記錄的哈希值不壹致,go命令將拒絕構建。 這就是go.sum存在的意義,即如果不使用期望的版本,就不能構建。

校驗和數據庫

環境變量GOSUMDB標識壹個checksum database,即校驗和數據庫,實際上是壹個web服務器,該服務器提供查詢依賴包版本哈希值的服務。

該數據庫中記錄了很多依賴包版本的哈希值,比如Google官方的sum.golang.org則記錄了所有的可公開獲得的依賴包版本。除了使用官方的數據庫,還可以指定自行搭建的數據庫,甚至幹脆禁用它(export GOSUMDB=off)。

如果系統配置了GOSUMDB,在依賴包版本被寫入go.sum之前會向該數據庫查詢該依賴包版本的哈希值進行二次校驗,校驗無誤後再寫入go.sum。

如果系統禁用了GOSUMDB,在依賴包版本被寫入go.sum之前則不會進行二次校驗,go命令會相信所有下載到的依賴包,並把其哈希值記錄到go.sum中。

  • 上一篇:Android手機是基於linux的,可以當做壹般的linux電腦用嗎
  • 下一篇:華為新系統兼容安卓,是不是意味著底層還是安卓呢?
  • copyright 2024編程學習大全網