欢迎光临散文网 会员登陆 & 注册

go 的依赖管理 go. mod 与go. sum

2023-07-25 10:42 作者:青阳小栈  | 我要投稿


go 在做依赖管理时会创建两个文件,go. mod 和 go. sum。

### go.mod:

go. mod 提供了依赖版本的全部信息,而 go.sum 更偏向提供给程序的依赖指引.

有些项目没有 go. mod 这个文件,go 会尝试生成一个可能的 go.mod, 并取它的 checksum。


```

go. mod 内容大概如下:


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 语言管理包管理 `go mod` 而使用的一种锁文件,用于记录 Go 项目中所有依赖包的路径和哈希值。每一行记录了一个依赖项的信息,包括依赖项的模块路径、版本、哈希值等等

![[Pasted image 20230724180203.png]]

Go. Sum 文件的作用在于记录各个依赖项的版本和哈希值,用于验证项目的依赖关系是否发生变化。当使用 go mod 安装依赖包的时候,会根据 go. Mod 文件中指定的版本号下载相应的依赖包,并计算依赖包的哈希值,将这些信息记录到 go. Sum 中,当再次构建项目的时候,go. Mod 会检查 go. Sum 文件,确保依赖项的哈希值和之前记录的值一样,以此来保证项目的构建过程是可重现的 go. Sum 文件的重要性在于保证 Go 项目的依赖关系的可靠性和安全性,避免因为依赖包版本不一样导致的不可预期的问题


go. Sum 的每一行都是一个条目:


```

<module> <version> <hash>

<module> <version>/go. Mod <hash>

```


其中 module 是依赖的路径,version 是依赖的版本号。hash 是以 `h1:` 开头的字符串,表示生成 checksum 的算法是第一版的 hash 算法(sha256)。


go. sum 中的依赖管理是根据项目具体情况来生成的,根据项目内容不同而有差别:


一、项目是否打 tag?


如果项目没有打 tag,会生成一个版本号,格式如下:  

v0.0.0-commit日期-commitID


比如 `github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=`。


引用一个项目的特定分支,比如 develop branch,也会生成类似的版本号:  

v当前版本+1-commit日期-commitID


比如 `github.com/DATA-DOG/go-sqlmock v1.3.4-0.20191205000432-012d92843b00 h1:Cnt/xQ9MO4BiAjZrVpl0BiqqtTJjXUkWhIqwuOCVtWo=`。


二、项目有没有用 go module?


如果项目有用到 go module,那么就是正常地用 tag 来作为版本号。


比如 `github.com/DATA-DOG/go-sqlmock v1.3.3 h1:CWUqKXe0s8A2z6qCgkP4Kru7wC11YoAnoupUKFDnH08=`。


如果项目打了 tag,但是没有用到 go module,为了跟用了 go module 的项目相区别,需要加个 `+incompatible` 的标志。


比如 `github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=`


三、项目用的 go module 版本是不是 v2+?


关于 go module v2+ 的特性,可以参考 Go 的官方文档:https://blog.golang.org/v2-go...。简单而言,就是通过让依赖路径带版本号后缀来区分同一个项目里不同版本的依赖,类似于 `gopkg.in/xxx.v2` 的效果。


对于使用了 v2+ go module 的项目,项目路径会有个版本号的后缀。


比如 `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 依赖采用 go.sum 机制有两个目的:

一是 go 提供了分布式环境下的包管理依赖内容校验。

二是为了加强安全性,防止依赖包被篡改。


go 的依赖管理 go. mod 与go. sum的评论 (共 条)

分享到微博请遵守国家法律