[toc]
说一说go mod
写在前面,我们要切换到go mod吗
go mod是官方力推的go模块依赖管理的工具,有官方的背书,肯定是要用的。go1.13已经默认支持了,所以迟早要切到go mod, 势不可挡。
go mod什么
go mod能管理的依赖包的版本,能保证在不同地方构建,获得的依赖模块是一致的。
没有go mod之前如何管理包依赖
没有go mod之前,有go deps, vendor等方法来解决。
go mod如何工作
- go 1.11通过设置环境变量GO111MODULE来决定是否启用
export GO111MODULE=off #关闭go mod
export GO111MODULE=on # 开启mod
export GO111MODULE=auto # GOPATH/src不启用,但是还要看当前目录或者上级目录是否存在go.mod,go.sum,如果存在,则启用go mod
这里面有个坑,就是设置为auto的时候并且在GOPATH/src下,如果该目录或者父目录存在go.mod, go.sum文件,则go mod也是启用的
- go1.13已经默认开启
切换到go mod可能遇到的问题
- go mod download非常慢
export GOPROXY=https://mirrors.aliyun.com/goproxy/ #设置拉取的代理
export GOPROXY=file://本地路径 # 也可以从本地加载
- go mod下载的包不对
可下面的命令下载指定的版本
如果发现编译不过,可以通过下面命令列出指定mod的版本,然后go get拉指定版本号的包
go list -m -versions rsc.io/sampler
go get rsc.io/sampler@v1.3.1
1.13可以彻底不要GOPATH了
- go mod 会贯穿go tool工具链,这句话什么意思呢,意思是go test, go vet, go build等工具都会先检查依赖。go mod会自动工作。如果你依赖没有下载好,则会一直卡住。
* go mod init # 初始化当前目录为模块根目录,生成go.mod, go.sum文件
* go mod download # 下载依赖包
* go mod tidy #整理检查依赖,如果缺失包会下载或者引用的不需要的包会删除
* go mod vendor #复制依赖到vendor目录下面
* go mod 可看完整所有的命令
go mod虽好,但是费开发者的电脑磁盘,go mod拉下的包都会放 当前目录的pkg/mod目录下面, 意味着不同项目引用相同的包会重复下载,不像java的maven本地一个集中的目录,不重复下载。
更详细的说明可以看官方blog关于go mod的说明
https://blog.golang.org/using-go-modules
有疑问加站长微信联系(非本文作者)