go 的依賴(lài)管理 go. mod 與go. sum
go 在做依賴(lài)管理時(shí)會(huì)創(chuàng)建兩個(gè)文件,go. mod 和 go. sum。
### go.mod:
go. mod 提供了依賴(lài)版本的全部信息,而 go.sum 更偏向提供給程序的依賴(lài)指引.
有些項(xiàng)目沒(méi)有 go. mod 這個(gè)文件,go 會(huì)嘗試生成一個(gè)可能的 go.mod, 并取它的 checksum。
```
go. mod 內(nèi)容大概如下:
module github.com/wgpsec/ENScan
go 1.18
require (
? ? github.com/adjust/rmq/v4 v4.0.5
? ? github.com/antchfx/htmlquery v1.2.5
)?
require (
? ? github.com/antchfx/xpath v1.2.1 // indirect
? ? github.com/cespare/xxhash/v2 v2.1.1 // indirect
)
```
### go. sum:
go.sum 是 Go 語(yǔ)言管理包管理 `go mod` 而使用的一種鎖文件,用于記錄 Go 項(xiàng)目中所有依賴(lài)包的路徑和哈希值。每一行記錄了一個(gè)依賴(lài)項(xiàng)的信息,包括依賴(lài)項(xiàng)的模塊路徑、版本、哈希值等等
![[Pasted image 20230724180203.png]]
Go. Sum 文件的作用在于記錄各個(gè)依賴(lài)項(xiàng)的版本和哈希值,用于驗(yàn)證項(xiàng)目的依賴(lài)關(guān)系是否發(fā)生變化。當(dāng)使用 go mod 安裝依賴(lài)包的時(shí)候,會(huì)根據(jù) go. Mod 文件中指定的版本號(hào)下載相應(yīng)的依賴(lài)包,并計(jì)算依賴(lài)包的哈希值,將這些信息記錄到 go. Sum 中,當(dāng)再次構(gòu)建項(xiàng)目的時(shí)候,go. Mod 會(huì)檢查 go. Sum 文件,確保依賴(lài)項(xiàng)的哈希值和之前記錄的值一樣,以此來(lái)保證項(xiàng)目的構(gòu)建過(guò)程是可重現(xiàn)的 go. Sum 文件的重要性在于保證 Go 項(xiàng)目的依賴(lài)關(guān)系的可靠性和安全性,避免因?yàn)橐蕾?lài)包版本不一樣導(dǎo)致的不可預(yù)期的問(wèn)題
go. Sum 的每一行都是一個(gè)條目:
```
<module> <version> <hash>
<module> <version>/go. Mod <hash>
```
其中 module 是依賴(lài)的路徑,version 是依賴(lài)的版本號(hào)。hash 是以 `h1:` 開(kāi)頭的字符串,表示生成 checksum 的算法是第一版的 hash 算法(sha256)。
go. sum 中的依賴(lài)管理是根據(jù)項(xiàng)目具體情況來(lái)生成的,根據(jù)項(xiàng)目?jī)?nèi)容不同而有差別:
一、項(xiàng)目是否打 tag?
如果項(xiàng)目沒(méi)有打 tag,會(huì)生成一個(gè)版本號(hào),格式如下:??
v0.0.0-commit日期-commitID
比如 `github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=`。
引用一個(gè)項(xiàng)目的特定分支,比如 develop branch,也會(huì)生成類(lèi)似的版本號(hào):??
v當(dāng)前版本+1-commit日期-commitID
比如 `github.com/DATA-DOG/go-sqlmock v1.3.4-0.20191205000432-012d92843b00 h1:Cnt/xQ9MO4BiAjZrVpl0BiqqtTJjXUkWhIqwuOCVtWo=`。
二、項(xiàng)目有沒(méi)有用 go module?
如果項(xiàng)目有用到 go module,那么就是正常地用 tag 來(lái)作為版本號(hào)。
比如 `github.com/DATA-DOG/go-sqlmock v1.3.3 h1:CWUqKXe0s8A2z6qCgkP4Kru7wC11YoAnoupUKFDnH08=`。
如果項(xiàng)目打了 tag,但是沒(méi)有用到 go module,為了跟用了 go module 的項(xiàng)目相區(qū)別,需要加個(gè) `+incompatible` 的標(biāo)志。
比如 `github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=`
三、項(xiàng)目用的 go module 版本是不是 v2+?
關(guān)于 go module v2+ 的特性,可以參考 Go 的官方文檔:https://blog.golang.org/v2-go...。簡(jiǎn)單而言,就是通過(guò)讓依賴(lài)路徑帶版本號(hào)后綴來(lái)區(qū)分同一個(gè)項(xiàng)目里不同版本的依賴(lài),類(lèi)似于 `gopkg.in/xxx.v2` 的效果。
對(duì)于使用了 v2+ go module 的項(xiàng)目,項(xiàng)目路徑會(huì)有個(gè)版本號(hào)的后綴。
比如 `github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM=`
go.sum 示例:
```
github.com/adjust/rmq/v4 v4.0.5 h1:VU3Xa9qbkIti7pTUiZE88qo3V4coMo3fmgO04l1aPro=
github.com/adjust/rmq/v4 v4.0.5/go.mod h1:XSfjmFqSVBVA/tptvMEt/8BW/uGM1w88ZvUIt+HIRok=
github.com/antchfx/htmlquery v1.2.5 h1:1lXnx46/1wtv1E/kzmH8vrfMuUKYgkdDBA9pIdMJnk4=
github.com/antchfx/htmlquery v1.2.5/go.mod h1:2MCVBzYVafPBmKbrmwB9F5xdd+IEgRY61ci2oOsOQVw=
github.com/antchfx/xpath v1.2.1 h1:qhp4EW6aCOVr5XIkT+l6LJ9ck/JsUH/yyauNgTQkBF8=
github.com/antchfx/xpath v1.2.1/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs=
github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8=
github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk=
github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU=
github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs=
github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho=
github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA=
github.com/go-playground/validator/v10 v10.10.0 h1:I7mrTYv78z8k8VXa/qJlOlEXn/nBh+BF8dHX5nt/dr0=
github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos=
github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg=
```
go 依賴(lài)采用 go.sum 機(jī)制有兩個(gè)目的:
一是 go 提供了分布式環(huán)境下的包管理依賴(lài)內(nèi)容校驗(yàn)。
二是為了加強(qiáng)安全性,防止依賴(lài)包被篡改。