这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
两个路径 (GOROOT、GOPATH)
-
安装go sdk,配置go环境变量
-
Go env 查看环境变量
- GOROOT: sdk安装目录
- GOPATH: 项目路径
在 vendor 目录、GOPATH 目录、GOROOT 目录都可能存在依赖库(标准库、第三方库等)
1 . GOPATH 模式
-
$GOPATH :项目根路径
- src :项⽬源代码
- bin :可执行程序
- pkg :第三⽅依赖库
运行方式
所有工程代码要求放在GOPATH/src目录下
工程本身也将作为一个依赖包,可以被其它 GOPATH/src 目录下的工程引用
在 $GOPATH/src 下进行 .go 文件或源代码的存储,我们可以称其为 GOPATH 的模式缺点
- 没有版本控制的概念
- 所有项目都要放在 GOPATH/src 下就不能编译
2. vendor 特性/模式 (三方)
解决 GOPATH模式 所有项目都在$GOPATH/src目录的问题
可以随处可以创建项目,不用扎堆 src 目录下
- 方案原理:本地化构建
在每个项目下都创建一个 vendor 目录,每个项目所需的依赖都只会下载到自己vendor目录下.
在使用包时,会先从当前项目下的 vendor 目录查找,然后GOPATH 中查找,都没找到最后在 GOROOT中查找。 - 缺点
放弃了依赖重用,使得冗余度上升
3. Go Modules 模式(模块感知模式)
1. 可以管理依赖的版本
2. 工程不用全放在gopath/src
12
-
主要改动:
- GOMODULE模式下所有依赖的包存放在$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=""
12345678910
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
1234567891011121314151617181920
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 目录下
两个命令
go get xxx(下载xxx第三方依赖包并安装)
go get会做两件事:
- 从远程下载需要用到的包
- 执行
go install安装
拉取的过程总共分为了三大步,分别是 finding(发现)、downloading(下载)以及 extracting(提取), 并且在拉取信息上一共分为了三段内容:
go install xxx(安装xxx二进制可执行文件 )
go install 是建立在 GOPATH 环境变量上的,无法在独立的目录里使用 go install。
go install 会生成可执行文件直接放到bin目录下