go module 基本使用
前言
go的版本以至1.13,一直以来令人诟病的依赖管理也有了官方的方向,但是看了一下目前很多blog文章还是比较老的.
所以这里对 go mod 做一个大致的说明
正文
前提
go版本为1.13及以上
官方文档
如果你想更深层次的了解GO MODULE的意义及开发者们的顾虑,可以直接访问官方文档(EN)
https://github.com/golang/go/wiki/Modules
go module介绍
go module是go官方自带的go依赖管理库,在1.13版本正式推荐使用
go module可以将某个项目(文件夹)下的所有依赖整理成一个 go.mod 文件,里面写入了依赖的版本等
使用go module之后我们可不用将代码放置在src下了
具体的请往下看
开启go module
go在1.13版本默认是auto,代表 当项目在 GOPATH/src 外且项目根目录有 go.mod 文件时,开启 go module.
也就是说,如果你不把代码放置在 GOPATH/src 下则默认使用 MODULE 管理.
不好意思看错了,1.13+的版本判断开不开启MODULE的依据是根目录下有没有go.mod文件
我们也可手动更改为 on(全部开启)/off(全部不开启)
这里演示设置为 on
windows:
set GO111MODULE=on
mac:
export GO111MODULE=on
然后输入
go env
查看 GO111MODULE 选项
为 on 代表修改成功
GO PROXY
go module 的目的是依赖管理,所以使用 go module 时你可以舍弃 go get 命令(但是不是禁止使用, 如果要指定包的版本或更新包可使用go get,平时没有必要使用)
因go的网络问题, 所以推荐使用 goproxy.cn 设置详见
https://github.com/goproxy/goproxy.cn/blob/master/README.zh-CN.md
初始化
为你的项目第一次使用 GO MODULE(项目中还没有go.mod文件)
进入你的项目文件夹
cd xxx/xxx/test/
初始化 MODULE
go mod init test(test为项目名)
我们会发现在项目根目录会出现一个 go.mod 文件
注意,此时的 go.mod 文件只标识了项目名和go的版本,这是正常的,因为只是初始化了
检测依赖
go mod tidy
tidy会检测该文件夹目录下所有引入的依赖,写入 go.mod 文件
写入后你会发现 go.mod 文件有所变动
例如:
module test go 1.13 require ( github.com/gin-contrib/sessions v0.0.1 github.com/gin-contrib/sse v0.1.0 // indirect github.com/gin-gonic/gin v1.4.0 github.com/go-redis/redis v6.15.6+incompatible github.com/go-sql-driver/mysql v1.4.1 github.com/golang/protobuf v1.3.2 // indirect github.com/jinzhu/gorm v1.9.11 github.com/json-iterator/go v1.1.7 // indirect github.com/kr/pretty v0.1.0 // indirect github.com/mattn/go-isatty v0.0.10 // indirect github.com/sirupsen/logrus v1.2.0 github.com/ugorji/go v1.1.7 // indirect golang.org/x/sys v0.0.0-20191025021431-6c3a3bfe00ae // indirect gopkg.in/yaml.v2 v2.2.4 )
此时依赖还是没有下载的
下载依赖
我们需要将依赖下载至本地,而不是使用 go get
go mod download
如果你没有设置 GOPROXY 为国内镜像,这步百分百会夯住到死
此时会将依赖全部下载至 GOPATH 下,会在根目录下生成 go.sum 文件, 该文件是依赖的详细依赖, 但是我们开头说了,我们的项目是没有放到 GOPATH 下的,那么我们下载至 GOPATH 下是无用的,照样找不到这些包
导入依赖
go mod vendor
执行此命令,会将刚才下载至 GOPATH 下的依赖转移至该项目根目录下的 vendor(自动新建) 文件夹下
此时我们就可以使用这些依赖了
GOLAND设置开启 GO MODULE
可能是因为 GO MODULE 功能还需完善,GOLAND默认是关闭该功能的,我们需要手动打开(不排除之后更新会不会改成默认开启)
依赖更新
这里的更新不是指版本的更新,而是指引入新依赖
依赖更新请从检测依赖部分一直执行即可,即
go mod tidy
go mod download
go mod vendor
新增依赖
有同学会问,不使用 go get ,我怎么在项目中加新包呢?
直接项目中 import 这个包,之后更新依赖即可
在协作中使用 GOMODULE
要注意的是, 在项目管理中,如使用git,请将 vendor 文件夹放入白名单,不然项目中带上包体积会很大
git设置白名单方式为在git托管的项目根目录新建 .gitignore 文件
设置忽略即可.
但是 go.mod 和 go.sum 不要忽略
另一人clone项目后在本地进行依赖更新(同上方依赖更新)即可
GOMODULE常用命令
go mod init # 初始化go.mod go mod tidy # 更新依赖文件 go mod download # 下载依赖文件 go mod vendor # 将依赖转移至本地的vendor文件 go mod edit # 手动修改依赖文件 go mod graph # 打印依赖图 go mod verify # 校验依赖