Go Modules

Go modules 是 Go 语言的依赖解决⽅案。

发布于 Go1.11,成⻓于 Go1.12,丰富于 Go1.13,正式于 Go1.14 推荐在生产上使⽤。

Go modules 集成在Go 的工具链中,只要安装了 Go 就可以使用,它解决了以下几个问题:

  1. Go 语言长久以来的依赖管理问题。
  2. “淘汰” 现有的 GOPATH 的使用模式。
  3. 统一社区中其他的依赖管理工具(提供依赖迁移功能)。

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/

爬虫框架