更多学习笔记和示例代码请访问:github.com/wenjianzhan…
Go未解决的依赖问题
- 同一环境下,不同项目使用同一包的不同的版本
- 无法管理对包的特定版本的依赖
vendor路径
随着Go 1.5 release 版本的发布,vendor 目录被添加到除了 GOPATH 和 GOROOT 之外的依赖目录查找的解决方案。在 Go 1.6 之前,你需要手动的设置环境变量
查找依赖包路径的解决方案:
- 当前包下的 vendor 目录
- 向上级目录查找,直到找到 src 下的 vendor 目录
- 在 GOPATH 下面查找依赖包
- 在 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…