Go Modules
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 v1.11 后,都设置为 on:go env -w GO111MODULE=on
GOPROXY
GOPROXY 用于设置 Go 模块代理,用于使 Go 在拉取版本模块时通过镜像站点来快速拉取。
建议设置为国内的地址:
go env -w GOPROXY=https://goproxy.cn,direct
direct
用于指示 Go 回源到模块版本的源地址去抓取(比如 GitHub 等)
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"
初始化项目
使用 go mod 创建项目,不强制要求在
$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/zinx
- 依赖的版本是
v1.0.1
// indirect
表示间接依赖
module github.com/yusael/modules_test
go 1.17
require github.com/aceld/zinx v1.0.1 // indirect
同时项目中会生成 go.sum 文件:
- go.sum 作用:列出当前项目直接或间接依赖的所有模块版本,保证今后项目依赖版本不被篡改。
h1:hash
表示对整体项目 zip 文件打开后全部文件的校验和来生成的 hash不存在则表示依赖的库可能用不上。
xxx/go.mod h1:hash
go.mod 文件做的 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.1
的依赖修改为 xxx@v1.0.4
的依赖。
这个一般用不上,用上时请查阅当前的最新资料。
Golang 生态拓展
Web 框架
beego:https://github.com/astaxie/beego
gin:https://github.com/gin-gonic/gin
echo:https://github.com/labstack/echo
lris:https://github.com/kataras/iris
微服务框架
go kit:http://gokit.io/
Istio:https://istio.io/
容器编排
Kubernets:https://github.com/kubernetes/kubernetes
swarm:https://github.com/docker/classicswarm
服务发现
consul:https://github.com/hashicorp/consul
存储引擎
etcd:https://github.com/coreos/etcd
tidb:https://github.com/pingcap/tidb
静态建站
hugo:https://github.com/gohugoio/hugo
中间件
消息队列 nsq:https://github.com/nsqio/nsq
TCP 长连接框架(轻量服务器):https://github.com/aceld/zinx
Leaf(游戏服务器):https://github.com/name5566/leaf
RPC 框架,gRPC:https://grpc.io/
redis 集群:https://github.com/CodisLabs/codis