golang 之 go module
什么是go module
go module是go1.11版本之后推出来的版本管理工具,并且在go1.13之后默认支持。使用go module之后可以轻松的帮你告别gopath,那么什么是gopath呢?
GOPATH
GOPATH是go的环境变量,设置GOPATH
vi /etc/profile export GOROOT=/usr/local/go #设置为go安装的路径 export GOPATH=$HOME/gocode #默认安装包的路径 export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
其中GOPATH包含3个子目录,为
src
存放源代码(比如:.go .c .h .s等)pkg
编译时生成的中间文件(比如:.a)bin
编译后生成的可执行文件(为了方便,可以把此目录加入到 $PATH 变量中,如果有多个gopath,那么使用${GOPATH//://bin:}/bin
添加所有的bin目录)
环境准备
go1.11版本后启用go module需要开启GO11MODULE,并且确保项目不在GOPATH中。设置参数为on, off, auto
111MODULE=off
禁用模块支持,编译时会从GOPATH
和vendor
文件夹中查找包。GO111MODULE=on
启用模块支持,编译时会忽略GOPATH
和vendor
文件夹,只根据go.mod
下载依赖。GO111MODULE=auto
,当项目在$GOPATH/src
外且项目根目录有go.mod
文件时,开启模块支持。
当参数设置为on,开启成功。使用时会生成go.mod和go.sum两个文件。
加速下载,设置GOPROXY
go1.11版本后可设置: export GOPROXY=https://goproxy.cn go 1.13版本默认为: export GOPROXY=https://proxy.golang.or(在国内很慢) 所有我一般设置为https://goproxy.cn 或阿里源 https://mirrors.aliyun.com/goproxy/
初始化
常用命令
go mod download 下载依赖的module到本地cache(默认为$GOPATH/pkg/mod目录) go mod edit 编辑go.mod文件 go mod graph 打印模块依赖图 go mod init 初始化当前文件夹, 创建go.mod文件 go mod tidy 增加缺少的module,删除无用的module go mod vendor 将依赖复制到vendor下 go mod verify 校验依赖 go mod why 解释为什么需要依赖
比如对于从git拉取到本地的项目可直接使用go mod tidy生成依赖包。而对于一个新项目,则可使用go mod init 初始化
go mod vender
go mod vendor
会复制modules下载到vendor中, 貌似只会下载你代码中引用的库,而不是go.mod中定义全部的module。
go get & replace
对于项目中的新包可以使用go get 去下载。如
- 运行
go get -u
将会升级到最新的次要版本或者修订版本(x.y.z, z是修订版本号, y是次要版本号) - 运行
go get -u=patch
将会升级到最新的修订版本 - 运行
go get package@version
将会升级到指定的版本号version
replace本地包替换
基于国内防火墙的问题,可以使用,如
replace packagepath/pkg v0.0.0 => github.com/packagepath/pkg v0.0.0
godep
在引用go mod 之前。go采用godep来管理目录。或者直接本地GOPATHL路径(GOPATH过于繁琐)
安装
go get github.com/tools/godep
使用时会引用一个vendor目录,这样代码会首先去查找vendor目录
├── Gopkg.lock ├── Gopkg.toml ├── main.go └── vendor ├── github.com │ ├── gin-contrib │ ├── gin-gonic │ ├── golang │ ├── mattn │ └── ugorji ├── golang.org │ └── x └── gopkg.in ├── go-playground
常用命令
godep save 将依赖项输出并复制到Godeps.json文件中 godep go 使用保存的依赖项运行go工具 godep get 下载并安装具有指定依赖项的包 godep path 打印依赖的GOPATH路径 godep restore 在GOPATH中拉取依赖的版本 godep update 更新选定的包或go版本 godep diff 显示当前和以前保存的依赖项集之间的差异 godep version 查看版本信息
比如你在新项目中使用godep save时会在当前项目中创建Godeps
和vender
两个文件夹。
小结
在go1.13后默认支持go mod,所以还是最好使用go mod,并且管理项目也很方便快捷。
一般情况,go mod init 和 go mod tidy 两个命令就够用了。