Go mod 依赖管理
go mod 是什么
go modules是 golang 1.11引入的新特性。Modules官方定义为:
模块是相关Go包的集合。modules是源代码交换和版本控制的单元。go命令直接支持使用modules,包括记录和解析对其他模块的依赖性。modules替换旧的基于GOPATH的方法来指定在给定构建中使用哪些源文件。
GO111MODULE有三个值:off、on 和 auto(默认值)
GO111MODULE=off,无模块支持,go 会从 GOPATH 和 vendor 文件夹寻找包
GO111MODULE=on,模块支持,go 会忽略 GOPATH 和 vendor 文件夹,只根据 go.mod 下载依赖
GO111MODULE=auto,默认值,go命令行将会根据当前目录来决定是否启用module功能。这种情况下可以分为两种情形:
- 当前目录在GOPATH/src之外且该目录包含go.mod文件
- 当前文件在包含go.mod文件的目录下面。
在使用模块的时候,GOPATH 是无意义的,不过它还是会把下载的依赖储存在 $GOPATH/pkg/mod
中,也会把 go install
的结果放在 $GOPATH/bin
中。
启用go mod
go env -w GO111MODULE=on
GOPROXY设置代理
由于国内网络原因,Go生态系统中有许多无法直接获取的模块,且GitHub获取模块速度慢,因此需要配置GOPROXY来加速Module依赖下载:
go env -w GOPROXY=https://goproxy.cn,direct
go.mod 文件
go mod初始化会自动生成go.mod文件,初始化命令如下:
# go mod 初始化
go mod init 模块名(一般是文件夹名)
go.mod
文件详解:
// 模块名
module hello
// go sdk 版本
go 1.23.4
// 当前module(项目)依赖的包
require (
// dependency latest
)
// 排除第三方包
exclude (
// dependency latest
)
// 修改依赖包的路径或版本
// 依赖包发生迁移
// 原始包无法访问
// 使用本地包替换原始包
replace (
source latest => target latest
)
// 撤回
// 当前项目作为其他项目的依赖,如果某个版本出现了问题则撤回该版本
retract (
v1.0.1
)
go mod 命令
go mod init
初始化一个新的模块到当前目录
go mod init
# 例如
go mod init gomodcase
go mod tidy
依赖对齐:添加缺少的依赖,删除未使用的依赖
go mod tidy
go mod download
将模块下载到本地缓存,需要指定模块路径及版本号
注意:只会下载当前指定的模块,不会同时下载其依赖!
go mod download
# 例如
go mod download github.com/gin-gonic/gin@v1.9.0
go mod edit
通过工具或脚本编辑go.mod
go mod edit
# 例如
# 添加依赖项
go mod edit -require="github.com/gin-gonic/gin@v1.9.0"
# 替换路径,old[@version]替换成 new[@version]
go mod edit -replace="golang.org/x/crypto@v0.0.0=github.com/golang/crypto@latest'
# 排除第三方依赖的某个版本
go mod edit -exclude="github.com/gin-gonic/gin@v1.9.0"
# 当前项目作为其他项目的依赖时,添加撤回版本用于排除有问题的版本
go mod edit -retract="v1.0.0"
go mod edit -retract='v1.1.0"
# 删除撤回版本记录
go mod edit -dropretract="v1.0.0"
go mod vendor
根据go.mod中的依赖项制作vendor副本
有了vendor副本,项目将不再依赖本地缓存
go mod vendor
go mod verify
验证依赖是否正确:
go mod verify
go mod why
返回对指定模块的依赖关系最短路径,解释为什么依赖指定包
go mod why
# 例如
go mod why github.com/go-playground/validator/v10
go install/get/clean
# go insta11 安装可执行插件
# 例如
go insta11 github.com/google/gops@latest
# go get 获取模块信息并更新go.mod文件
# 若本地缓存没有该模块,则下载模块;若有则直接引用
# 例如
go get github.com/gin-gonic/gin@v1.9.0
# go get -u 更新模块依赖,并更新go.mod
go get -u github.com/gin-gonic/gin@v1.9.0
# go clean 清理临时目录中的文件
# 例如: 清理整个module下载的缓存文件
go clean -modcache