Go modules 是 Go 语言的依赖解决⽅案。
发布于 Go1.11,成⻓于 Go1.12,丰富于 Go1.13,正式于 Go1.14 推荐在生产上使⽤。
Go modules 集成在Go 的工具链中,只要安装了 Go 就可以使用,它解决了以下几个问题:
- Go 语言长久以来的依赖管理问题。
- “淘汰” 现有的 GOPATH 的使用模式。
- 统一社区中其他的依赖管理工具(提供依赖迁移功能)。
GO PATH 的弊端:
- 无版本控制概念
- 无法同步一致第三方版本号
- 无法指定当前项⽬引用的第三⽅版本号
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 目录 |
got mod verify | 检验一个模块是否被篡改过 |
go mod why | 查看为什么需要依赖某模块 |
go mod 环境变量
通过 go env 命令进行查看:
$ go env
GO111MODULE="auto"
GOPROXY="https://goproxy.cn,direct"
GONOPROXY=""
GOSUMDB="sum.golang.org"
GONOSUMDB=""
GOPRIVATE=""
...
GO111MODULE
GO111MODULE 表示是否开启 Go modules 模式,允许设置以下参数:
- auto:项目包含了 go.mod 文件就启用 Go Modules。
- on:启用 Go modules ,推荐设置。
- off:禁用 Go modules,不推荐。
go env -w GO111MODULE=on
GOPROXY
GOPROXY 用于设置 Go 模块代理,用于使 Go 在拉取版本模块时通过镜像站点来快速拉取。
建议设置为国内的地址:
go env -w GOPROXY=https://goproxy.cn,direct
direct
GOSUMDB
GOSUMDB 用于检验拉取的第三方库是否完整。
默认值是 sum.golang.org(国内无法访问),但是如果设置了 GOPROXY 默认就会被代理。
GOPRIVATE
GOPRIVATE 环境变量的值也将作为 GONOPROXY 和 GONOSUMDB 的默认值。
这三个环境变量都是用于公司依赖了私有模块,需要设置,否则会拉取失败。
使用示例:
设置 git.example.com 和 github.com/aceld/zinx 是私有仓库,不会进行 GOPROXY 下载和检验
go env -w GOPRIVATE="git.example.com,github.com/aceld/zinx
设置 example.com 的子域名,比如 git.example.com、hello.example.com,都不进行 GOPROXY 下载和检验
go env -w GOPRIVATE="*.example.com"
初始化项目
$GOPATH/src
创建 go.mod 文件,同时为当前项目的模块命名:(以后别人通过这个名字导入你的模块)
go mod init github.com/yusael/modules_test
会生成一个 go.mod 文件:
module github.com/yusael/modules_test
go 1.17
github.com/aceld/zinx/znet)
go get github.com/aceld/zinx/znet
下载后 go.mod 文件中会添加一行新代码:
github.com/aceld/zinxv1.0.1// indirect
module github.com/yusael/modules_test
go 1.17
require github.com/aceld/zinx v1.0.1 // indirect
同时项目中会生成 go.sum 文件:
h1:hashxxx/go.mod h1:hash
github.com/aceld/zinx v1.0.1 h1:WnahGyE7tDJvkJRVK2VI/m57aHEeUjr12EAYpOYW3ng=
github.com/aceld/zinx v1.0.1/go.mod h1:Tth0Fmjjpel0G8YjCz0jHdL0sXlc4p3Km/l/srvqqKo=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
修改项目版本依赖关系
go mod edit -replace=xxx@v1.0.1=xxx@v1.0.4
xxx@v1.0.1xxx@v1.0.4
这个一般用不上,用上时请查阅当前的最新资料。
Golang 生态拓展Web 框架
微服务框架
容器编排
服务发现
存储引擎
静态建站
中间件
TCP 长连接框架(轻量服务器):https://github.com/aceld/zinx
RPC 框架,gRPC:https://grpc.io/