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⽂件就会被修改