后端Go依赖管理|青训营笔记

66 阅读1分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天

两个路径 (GOROOT、GOPATH)

  1. 安装go sdk,配置go环境变量

  2. Go env 查看环境变量

    • GOROOT: sdk安装目录
    • GOPATH: 项目路径

在 vendor 目录、GOPATH 目录、GOROOT 目录都可能存在依赖库(标准库、第三方库等)

1 . GOPATH 模式

  • $GOPATH :项目根路径

    • src :项⽬源代码
    • bin :可执行程序
    • pkg :第三⽅依赖库

运行方式

所有工程代码要求放在GOPATH/src目录下
工程本身也将作为一个依赖包,可以被其它 GOPATH/src 目录下的工程引用
在 $GOPATH/src 下进行 .go 文件或源代码的存储,我们可以称其为 GOPATH 的模式

缺点

  1. 没有版本控制的概念
  2. 所有项目都要放在 GOPATH/src目录下,不在GOPATH/src目录下,不在 GOPATH/src 下就不能编译

在这里插入图片描述

2. vendor 特性/模式 (三方)

解决 GOPATH模式 所有项目都在$GOPATH/src目录的问题
可以随处可以创建项目,不用扎堆 src 目录下

  • 方案原理:本地化构建
    在每个项目下都创建一个 vendor 目录,每个项目所需的依赖都只会下载到自己vendor目录下.
    在使用包时,会先从当前项目下的 vendor 目录查找,然后GOPATH 中查找,都没找到最后在 GOROOT中查找。
  • 缺点
    放弃了依赖重用,使得冗余度上升
    在这里插入图片描述

3. Go Modules 模式(模块感知模式)

1. 可以管理依赖的版本
2. 工程不用全放在gopath/src

12
  • 主要改动:

    1. GOMODULE模式下所有依赖的包存放在$GOPATH/pkg/mod目录下
    2. 项目中需要有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会做两件事:

  1. 从远程下载需要用到的包
  2. 执行go install安装

拉取的过程总共分为了三大步,分别是 finding(发现)、downloading(下载)以及 extracting(提取), 并且在拉取信息上一共分为了三段内容:
在这里插入图片描述

go install xxx(安装xxx二进制可执行文件 )

go install 是建立在 GOPATH 环境变量上的,无法在独立的目录里使用 go install。

go install 会生成可执行文件直接放到bin目录下