go module包管理学习笔记

go module仓库代理(阿里云):GOPROXY=https://mirrors.aliyun.com/goproxy/

1.设置模块支持

go 1.11 有了对模块的实验性支持,大部分的子命令都知道如何处理一个模块,比如 run build install get list mod 子命令,第三方工具可能会支持的晚一些。到 go 1.12 会删除对 GOPATH 的支持,go get 命令也会变成只能获取模块,不能像现在这样直接获取一个裸包。

可以用环境变量 GO111MODULE 开启或关闭模块支持,它有三个可选值:offonauto,默认值是 auto

  • GO111MODULE=off 无模块支持,go 会从 GOPATH 和 vendor 文件夹寻找包。
  • GO111MODULE=on 模块支持,go 会忽略 GOPATH 和 vendor 文件夹,只根据 go.mod 下载依赖。
  • GO111MODULE=auto$GOPATH/src 外面且根目录有 go.mod 文件时,开启模块支持。

在使用模块的时候,GOPATH 是无意义的,不过它还是会把下载的依赖储存在 $GOPATH/pkg/mod 中,也会把 go install 的结果放在 $GOPATH/bin 中。

2.初始化模块

go mod init [module name]

我们运行下 go mod init test命令试试,目录下生成了一个go.mod的文件,内容如下:

module test

go 1.12

比如我要安装beego框架,运行下命令:go get github.com/astaxie/beego

文件内容发生了变化:

module test

go 1.12

require (
    github.com/astaxie/beego v1.12.0 // indirect
    github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 // indirect
)

说明go get对文件产生了影响,把安装的包引入到了go.mod文件里。

其他命令说明:

go mod download :安装mod的模块到本地缓存

go mod vendor:vendor版本的解决方案,将依赖复制到vendor下面。

go mod tidy:移除未用的模块,以及添加缺失的模块。

go mod verify:验证所有模块是否正确。

以前都是下到$GOPATH/src下再引用模块,感觉有点OUT啊,这种方法好多了...