这是我参与「第五届青训营」伴学笔记创作活动的第3天
笨人纯小白,笔记包括一些上课学到的知识和课外总结的内容,如有错误请指正!
五、Golang依赖管理
Golang依赖发展史:
- 1.5版本之前,所有的依赖包都是存放在GOPATH下,没有版本控制;
- 1.5版本推出了vendor机制;
- 1.7版本vendor目录永远启用;
- 1.11版本推出modules机制,简称mod;
- 1.13起不再推荐使用GOPATH的使用模式;
GO11MODULE=auto - 1.16默认开启Modules。
GO111MODULE=on
两个路径(GOROOT、GOPATH)
- 安装go sdk,配置go环境变量
- Go env查看环境变量
- GOROOT:sdk安装目录
- GOPATH:项目路径
在vendor目录、GOPATH目录、GOROOT目录都可能存在依赖库(标准库、第三方库等)
5.1 GOPATH模式
- $ GOPATH:项目根路径
- src:项目源代码
- bin:可执行程序
- pkg:第三方依赖库
运行方式
所有工程代码要求放在$ GOPATH/src目录下;
工程本身也将作为一个依赖包,可以被其它$ GOPATH/src目录下的工程引用;
在$ GOPATH/src下进行.go文件或源代码的存储,我们可以称其为GOPATH的模式
缺点
- 没有版本控制的概念
- 所有项目都要放在
$ GOPATH/src的目录下,不在$ GOPATH/src下就不能编译
5.2 vendor特性/模式(三方)
解决GOPATH模式下所有项目都在$ GOPATH/src目录的问题;
可以随处创建项目,不用扎堆src目录下
方案原理:本地化构建
在每个项目下都创建一个vendor目录,每个项目所需的依赖都只会下载到自己的vendor目录下。在使用包时。会先从当前项目下的vendor目录查找,然后从GOPATH中查找,都没找到最后在再在GOROOT中查找。
缺点
放弃了依赖重用,使得冗余度上升
5.3 Go Modules模式(模块感知模式)
1. 可以管理依赖的版本
2. 工程不用全放在$ GOPATH/src
主要改动
- GOMUDULE模式下所有依赖的包存放在$ GOPATH/pkg/mod目录下
- 项目中需要有go.mod文件,来应用$ GOPATH/pkg/mod
mod相关环境变量
# Modules 开关
GO111MODULE="auto"
# Go 模块代理(脱离VCS版本控制方式,直接通过镜像站点来拉取)
GOPROXY="https://proxy.golang.org,direct" # 国内无法访问
# 保证拉取到的模块版本数据未经过篡改
GOSUMDB="sum.golang.org" # 国内无法访问
# 私有模块配置(用于Go 模块代理无法访问到的地方,如私有库)
GONOPROXY=""
GONOSUMDB=""
GOPRIVATE=""
go.mod文件
启用了Go modules的项目,在其初始化项目时,会生成一个go.mod文件。描述了当前项目(也就是当前模块)的元信息
# module:用于定义当前项目的模块路径。
module github.com/eddycjy/module-repo
# go:用于标识当前模块的 Go 语言版本,值为初始化模块时的版本,目前来看还只是个标识作用。
go 1.13
# require:用于设置一个特定的模块版本。
require (
example.com/apple v0.1.2
example.com/banana v1.2.3
example.com/banana/v2 v2.3.4
example.com/pear // indirect # indirect 标识表示该模块为间接依赖
example.com/strawberry // incompatible
)
# exclude:排除一个特定的模块版本。
exclude example.com/banana v1.2.4
# replace:用于将一个模块版本替换为另外一个模块版本。
replace example.com/banana => example.com/fish
go mod命令
| 命令 | 作用 |
|---|---|
| go mod init | 生成go.mod文件 |
| go mod download | 下载go.mod文件中指明的所有依赖 |
| go mod tidy | 整理现有的依赖(拉取缺少的模块,移除不用的模块) |
| go mod graph | 查看现有的依赖结构 |
| go mod edit | 编辑go.mod文件 |
| go mod vendor | 将依赖恢复到vendor目录下 |
| go mod verify | 校验一个模块是否被篡改过 |
| go mod why | 查看为什么需要依赖某模块 |
其中go mod download拉取模块的结果缓存在$ GOPATH/pkg/mod和$ GOPATH/pkg/sumdb目录下