go modules
go modules官方资料:https://github.com/golang/go/wiki/Modules
go版本控制发展史:
Go 1.5 Release之前
使用GOPATH,包管理、项目代码都依赖于GOPATH,项目代码位于GOPATH的src文件夹之下;
Go 1.5 Release到Go 1.10 Release
使用vender目录来管理包依赖(Go 1.5需要配置,Go 1.6及之后默认打开);
查找依赖包路路径的解决⽅方案如下:
- 当前包下的 vendor ⽬目录
- 向上级⽬目录查找,直到找到 src 下的 vendor ⽬目录
- 在 GOPATH 下⾯面查找依赖包
- 在 GOROOT ⽬目录下查找
常⽤用的依赖管理工具
godep https://github.com/tools/godep
glide https://github.com/Masterminds/glide
dep https://github.com/golang/dep
Go 1.11 Release到Go 1.13 Release
使用go modules模块(module-mode)进行依赖管理,在go1.11与go1.12要设置环境变量GO111MODULE=auto
启用module-mode;在go1.13中GO111MODULE=auto
为默认设置,即默认启用module-mode,不需要设置了。
go modules介绍
GO111MODULE=auto
启用,go 1.13默认启用,用于go项目的依赖管理。当编译、运行go项目时,若发现后缀有.mod
文件时即启用module-mode来编译、运行项目。使用module-mode后,项目目录不再需要放置于GOPATH/src目录下了(go1.13及其之后,使用module-mode的项目目录强制不能位于GOPATH目录之内)。
go moudles功能
1.自动添加import声明,如果
.go
文件中需要的模块;2.根据代码中import声明,go中的标准命令(go build,go run,go test等)会自动下载合适的依赖,并更新
go.mod
文件;3.通过命令go get [moduleName] @[moduleVersion](列如,
go get foo@v1.2.3, go get foo@master, go get foo@e3702bed2
)来指定项目中所依赖的模块具体版本,也可以通过编辑go.mod
文件来指定以来版本go modules配置
GO111MODULE=auto
启用module-mode,即使用go modules管理项目依赖;go1.11,go1.12需要在环境变量中配置,go1.13为默认配置(并且禁止使用module-mod的项目目录存放在GOPATH下)。
GO111MODULE 环境变量:
- auto 或者不设置—默认设置,会根据执行命令的目录是否有
go.mod
文件来确定是否使用module-mode; - on — 执行命令的目录强制使用moudle-mode;
- off — 执行命令的目录强制不使用moudle-mode;
-
GOPRIVATE
如果需要使用自己或公司的私有代码库,则需要使用GOPRIVATE
配置私有库或项目的地址。
例如:
go env -w GOPRIVATE=*.corp.com,github.com/secret/repo
-
GONOPROXY
设置默认下载依赖的公有Go模块镜像的代理地址,默认为https://proxy.golang.org;其它的代理地址可以查看(details) -
GONOSUMDB
设置与本地下载的go依赖进行对比校验的公共校验数据库代理地址,默认为 https://sum.golang.org
go modules使用
1、开启go modules并设置反向代理
上面已说过,go1.13以上版本GO111MODULE默认已自动开启,不需要重新设置;反向代理主要用来解决获取包时的网络限制,需要设置一下
linux环境下,再终端输入:
export GO111MODULE=auto
export GOPROXY=https://goproxy.io
不过这种是一次性的,重启之后就会消失,所以可以在环境信息文件/etc/profile
的最后面添加上下面这两行,最后使用source /etc/profile
让其生效
windows环境下设置,在系统环境变量中新增GO111MODULE和GOPROXY,如下图:
另外一种方法是使用Goland IDE vgo,设置如下:
2、在GOPATH 之外的地方,新建一个空文件夹go-mod-test,执行go mod init命令初始化(注意cd到go-mod-test目录下)
go mod init初始化命令会在当前目录下生成一个go.mod文件,内容如下:
3、添加依赖包,以gin为案例,gin传送门https://github.com/gin-gonic/gin
在目录中创建一个 main.go
的文件,放上如下代码(代码为gin官方启动实例):
package main import "github.com/gin-gonic/gin" func main() { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080") }
4、执行go mod tidy命令(也可以执行:go build/go run),执行完成后,看一下 go.mod
文件
看到新增一个 gin v1.5.0 的包,还发现目录下成了一个 go.sum 的文件,这个文件可以暂时先不管
此时,你可能很好奇,目录中没发现 gin 包,包下载到哪了?
下载到了 GOPATH/pkg/mod 目录中
5、go run main.go运行一下,在浏览器中输入:localhost:8080/ping,运行效果如下
搞清楚go modules用法后,顿时感觉go包管理方便了好多,可以脱离GOPATH创建项目了,同时包可以指定特定版本了,
反向代理的设置终于摆脱网络限制了,之前很多包由于网络原因下载不下来,简直是噩梦啊
go modules常见命令:
go mod init: 初始化modules
go mod download: 下载依赖的module到本地cache
go mod edit: 编辑go.mod文件,选项有-json、-require和-exclude,可以使用帮助go help mod edit
go mod graph: 以文本模式打印模块需求图
go mod tidy: 检查,删除错误或者不使用的modules,以及添加缺失的模块
go mod vendor: 生成vendor目录,将依赖复制到vendor目录下面
go mod verify: 验证依赖是否正确
go mod why: 解释为什么需要依赖
go list -m: 查看主模块的路径
go list -m -f={{.Dir}}: 查看主模块的根目录
go list -m all: 查看当前的依赖和版本信息
命令使用:
1、go list -m all //列出项目使用的依赖包
2、go list -m -versions github.com/gin-gonic/gin //查看依赖的版本历史
3、go get github.com/gin-gonic/gin@v1.4.0 //依赖包更新到指定版本
4、go mod edit -require="github.com/gin-gonic/gin@v1.4.0" // 修改 go.mod 文件(从v1.5.0变成了v1.4.0)
5、go mod tidy //下载更新依赖