Go modules 是 Go 语⾔的依赖解决⽅案,发布于 Go1.11,成⻓于 Go1.12,丰富于 Go1.13,正式于 Go1.14 推荐在⽣产上使⽤。
解决了什么问题 ?
Go 语⾔⻓久以来的依赖管理问题。
“淘汰”现有的 GOPATH 的使⽤模式。
统⼀社区中的其它的依赖管理⼯具(提供迁移功能)。
GOPATH的⼯作模式
GOPATH的弊端 :⽆版本控制概念 ⽆法同步⼀致第三⽅版本号 ⽆法指定当前项⽬引⽤的第三⽅版本号
Go Modules模式
go mod命令
go mod init ⽣成 go.mod ⽂件
go mod download 下载 go.mod ⽂件中指明的所有依赖
go mod tidy 整理现有的依赖
go mod graph 查看现有的依赖结构
go mod edit 编辑 go.mod ⽂件
go mod vendor 导出项⽬所有的依赖到vendor⽬录
go mod verify 校验⼀个模块是否被篡改过
go mod why 查看为什么需要依赖某模块
go mod 环境变量
GO111MODULE 是否开启go modules模式 建议go V1.11之后,都设置为on
GOPROXY 项⽬的第三⽅依赖库的下载源地址 建议设置国内的地址 阿⾥云 https://mirrors.aliyun.com/goproxy/ 七⽜云 https://goproxy.cn,direct
direct ⽤于指示 Go 回源到模块版本的源地址去抓取(⽐如 GitHub 等)
GOSUMDB ⽤来校验拉取的第三⽅库是否是完整的 默认也是国外的⽹站,如果设置了GOPROXY,这个就不⽤设置了
GONOPROXY 通过设置GOPRIVATE即可
GONOSUMDB 通过设置GOPRIVATE即可
GOPRIVATE 通过设置GOPRIVATE即可
go env -w GOPRIVATE="git.example.com,github.com/aceld/zinx 表示git.example.com 和 github.com/aceld/zinx 是私有仓库,不会进⾏GOPROXY下载和校验
go evn -w GOPRIVATE="*.example.com" 表示所有模块路径为example.com的⼦域名,⽐如 git.example.com 或者 hello.example.com 都不进⾏ GOPROXY下载和校验
通过 go env来查看环境变量 go env -w GO111MODULE=on 或者通过 Linux export 环境⽅式也可以
使⽤Go Modules初始化项⽬
1 开启Go Modules模块 保证GO111MODULE=on
go env -w GO111MODULE=on
export GO111MODULE=on 设置在⽤户启动脚本中 需要重新打开终端或者执⾏source ~/.bashrc
2 初始化项⽬
(1)任意⽂件夹创建⼀个项⽬(不要求在$GOPATH/src) mkdir -p $HOME/aceld/modules_test
(2)创建go.mod⽂件,同时起当前项⽬的模块名称 go mod init github.com/aceld/module_test
就会⽣成⼀个go mod⽂件
在该项⽬编写源代码
如果源代码中依赖某个库(⽐如: github.com/aceld/zinx/znet)
⼿动down go get github.com/aceld/zinx/znet
⾃动down
(3)go mod ⽂件会添加⼀⾏新代码
含义当前模块依赖github.com/aceld/zinx
依赖的版本是 v0.0.0-20200315073925-f09df55dc746
//indirect 表示间接依赖 因为项⽬直接依赖的是znet包 所以所间接依赖zinx包
(4)会⽣成⼀个go.sum⽂件
github.com/aceld/zinx v0.0.0-20200315073925-f09df55dc746 h1:TturbcEfboY81jsKVSQtGkqk8FN8ag0TmKYzaFHflmQ=
github.com/aceld/zinx v0.0.0-20200315073925-f09df55dc746/go.mod h1:bMiERrPdR8FzpBOo86nhWWmeHJ1cCaqVvWKCGcDVJ5M=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
go.sum⽂件的作⽤ 罗列当前项⽬直接或间接的依赖所有模块版本,保证今后项⽬依赖的版本不会被篡改
h1:hash 表示整体项⽬的zip⽂件打开之后的全部⽂件的校验和来⽣成的hash 如果不存在,可能表示依赖的库可能⽤不上
xxx/go.mod h1:hash go.mod⽂件做的hash
修改项⽬模块的版本依赖关系
go mod edit -replace=zinx@v0.0.0-20200306023939bc416543ae24=zinx@v0.0.0-20200221135252-8a8954e75100
go mod⽂件就会被修改