go mod 包依赖管理

目录

可以通过 go help modules命令查看关于go mod的更多信息,也可以直接访问https://github.com/golang/go/wiki/Modules 获取更多信息。

GO 1.11 包依赖管理

在Go 1.11 (Go 1.11 发布于 2018-11-21 日) 版本之前的Go user官方调查中,Gopher抱怨最多的三大问题如下:

  • 包依赖管理
  • 缺少泛型
  • 错误处理

而Go 1.11开启了问题1:包依赖管理解决的实验。


环境变量的设置

在go1.11和go1.12版本中,因为没有将gomod设置为默认包管理方式,增加了一个临时环境变量GO111MODULE来控制使用方式。这个环境变量有三种设置方式:off、on、auto

  • off,则go命令从不使用go modules的功能,在执行go命令时将继续在GOPATH中查找依赖包,继续使用老的GOPATH模式
  • auto,当go源码不在GOPATH路径下且当前目录或者上层目录存在go.mod文件时,启用gomod模式,否则将使用GOPATH模式
  • on,则go命令使用go mod模式,命令执行过程中将忽略GOPATH的设置,按照gomod的方式管理go程序

需要通过两个临时的环境变量设置默认支持go mod模式

export GO111MODULE=on

export GOPROXY=https://goproxy.io

go mod文件 位置

项目得在GOPATH以外的任意目录


go mod 命令介绍

当项目运行在go mod模式下时,执行go相关的命令run build test get等会下载或者更新项目依赖的包。

一般情况,go mod initgo mod tidy 两个命令就够用了。

  • download:下载依赖的包到本地缓存目录
  • edit:编辑go.mod文件
  • graph:打印模块输出图
  • init:初始化modules项目
  • tidy:添加缺失的依赖或者移除未使用的依赖
  • vendor:生成vendor依赖目录
  • verify:验证依赖是否正确
  • why:解释为什么需要相关依赖

go mod 管理的包文件位置

$GOPATH/pkg/mod里面,mod做了一件类似maven的事把所有包都打上了版本号;

img_21.png


go.mod文件样例
module zctc_knowledge

go 1.14

require (
    github.com/astaxie/beego v1.12.2
    github.com/go-sql-driver/mysql v1.5.0
    github.com/lib/pq v1.7.0 // indirect
    github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
    github.com/modern-go/reflect2 v1.0.1 // indirect
    github.com/mojocn/base64Captcha v1.3.1
    github.com/smartystreets/goconvey v1.6.4
    golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550
    golang.org/x/image v0.0.0-20190802002840-cff245a6509b // indirect
    golang.org/x/text v0.3.2 // indirect
    gopkg.in/yaml.v2 v2.3.0 // indirect
)