go mod

发布时间 2023-07-04 15:36:18作者: 日新其德止于至善

什么是go mod

go mod是golang官方V1.11版本推出的包管理工具

 

go mod使用

# 初始化完成后生成go.mod文件
go mod init moduleName 
# 整理现有依赖,安全去除无用的依赖
go mod tidy  
# 更新依赖的模块
go get -u
# 查看当前模块的依赖和版本号
go list -m all

# 拉取模块最新版本
go get module@latest
# 拉取master分支的最新版本
go get module@master
# 拉取指定tag版本
go get module@v0.1
# 拉取指定commit版本
go get module@483479

# 查看现有的依赖结构
go mod graph
# 编辑go.mod文件 
go mod edit --replace=golang.org/...=github.com/golang... 
# 校验一个模块是否被篡改过
go mod verify

# help命令
go mod help

 

go.mod文件

go.mod 是启用了 Go moduels 的项目所必须的最重要的文件,它描述了当前项目的元信息,每一行都以一个动词开头,目前有以下 5 个动词:

  • module:用于定义当前项目的模块路径
  • go:用于设置预期的 Go 版本
  • require:用于需求一个特定的模块版本
  • exclude:用于从使用中排除一个特定的模块版本,表示模块肯定不用某个版本
  • replace:用于将一个模块版本替换为另外一个模块版本。主要为了解决某些包发生改名的问题。对于另外一种场景有的时候也是有用的,比如对于有些 golang.org/x/ 下面的包由于某些原因在国内是下载不了的,但是对应的包在 github 上面是有一份拷贝的,这个时候我们就可以将 go.mod 中的包进行 replace 操作
go mod 补充
1、首先go mod遵循SemVer2.0规范 (https://semver.org/lang/zh-CN/)
2、require中的v0和v1都是正常的表示方法,但v2+以后会有特殊处理,下面讲;
3、v2.1.0+incompatible就是上面说的v2+版本比较特殊,go mod认为超过v2的版本(包含v2.0.0),就应该在目录中添加一个v2/目录,比如modue1 lib想要升级v2版本,应该在里面创建一个目录modue1/v2,然后import改成v2的路径,v3类似,如果没有按照此规范引用,就会在后面加一个"+incompatible",表示没有遵循go mod规范;
4、v0.0.0-20191106060620-5a63151ff6d5的版本号,表示此包没有可用的semver版本号,所以按照v0.0.0-yyyymmddhhiiss-commitid表示;
5、indirect 表示间接应用的包

 

go.sum文件

go.sum 是在go命令执行中自动生成的,详细罗列了当前项目直接或间接依赖的所有模块版本,并写明了那些模块版本的 SHA-256 哈希值。用于保证在后面的操作中所依赖的那些模块不会被篡改。

 

go mod相关环境变量

GO111MODULE:控制是否启用go modules功能来管理依赖包。v1.11版本该变量默认是off,v1.13默认开启。

auto:只在项目包含了 go.mod 文件时启用 go modules,如果不包含go.mod就还会在GOPATH/src路径去找依赖。
on:强制启用 go modules。
off:禁用 go modules

GOPROXY:设置拉取代码时的代理服务器。

GOSUMDB:GOSUMDB 的全称为 Go CheckSum Database,用来下载的包的安全性校验问题。包的安全性在使用 GoProxy 之后更容易出现,比如我们引用了一个不安全的 GoProxy 之后然后下载了一个不安全的包,这个时候就出现了安全性问题。对于这种情况,可以通过 GOSUMDB 来对包的哈希值进行校验。当然如果想要关闭哈希校验,可以将 GOSUMDB 设置为 off。

 

参考文档

https://learnku.com/docs/go-mod/1.17