[go学习笔记]十九、go语言的依赖管理

177 阅读2分钟

更多学习笔记和示例代码请访问:github.com/wenjianzhan…

Go未解决的依赖问题

  1. 同一环境下,不同项目使用同一包的不同的版本
  2. 无法管理对包的特定版本的依赖

vendor路径

随着Go 1.5 release 版本的发布,vendor 目录被添加到除了 GOPATH 和 GOROOT 之外的依赖目录查找的解决方案。在 Go 1.6 之前,你需要手动的设置环境变量

查找依赖包路径的解决方案:

  1. 当前包下的 vendor 目录
  2. 向上级目录查找,直到找到 src 下的 vendor 目录
  3. 在 GOPATH 下面查找依赖包
  4. 在 GOROOT 目录下查找

常用的依赖管理工具

godep glide dep gomod

作者使用的是 gomod 初始化 项目包管理

当项目不在 GOPATH 中,直接执行:

go mod init

项目会报错:

$ go mod init remote_package                                                            
go: modules disabled inside GOPATH/src by GO111MODULE=auto; see 'go help modules'

那这个时候需要手动激活 Modules:

$ export GO111MODULE=on

一般情况下,需要在环境变量里边配置 export GO111MODULE=on

sudo vim ~/.base_profile

// 追加 export GO111MODULE=on 
// 启用 go Modules功能;
// 还可以设置 GOPROXY 环境变量
// 一个免费的、可靠的、持续在线的且经过 CDN 加速的模块代理。

export GOPROXY=https://goproxy.cn

// 保存好后别忘记重载
source ~/.bash_profile

// 再次执行(需要在项目内)
go mod init

// 或者指定项目路径
go mod init xxx

执行完成后 项目路径下 会多出来一个 vendor 文件夹 和 go.mod

vendor 里边是存放的依赖的包

go.mod 是存放的包引用信息,可以使用 go mod tidy

go mod 的常用cmd

命令 说明
download download modules to local cache(下载依赖包)
edit edit go.mod from tools or scripts(编辑go.mod)
graph print module requirement graph (打印模块依赖图)
init initialize new module in current directory(在当前目录初始化mod)
tidy add missing and remove unused modules(拉取缺少的模块,移除不用的模块)
vendor make vendored copy of dependencies(将依赖复制到vendor下)
verify verify dependencies have expected content (验证依赖是否正确)
why explain why packages or modules are needed(解释为什么需要依赖)

为什么要使用GOPROXY

由于 Go 生态系统中有着许多中国 Gopher 们无法获取的模块,比如最著名的 golang.org/x/...。并且在中国大陆从 GitHub 获取模块的速度也有点慢。因此,我们创建了 Goproxy 中国,使在中国的 Gopher 们能更好地使用 Go 模块。事实上,由于 goproxy.cn 已通过 CDN 加速,所以其他国家的 Gopher 们也可以使用它。

更多学习笔记和示例代码请访问:github.com/wenjianzhan…