Go语言的依赖管理 | 豆包MarsCode AI刷题

104 阅读3分钟

Go语言依赖管理的演进分为三个阶段:

1、GOPATH:

GOPATH是go语言支持的环境变量,其目录包括三个文件夹:
bin:存放项目编译产生的二进制文件
pkg:存放项目编译的中间产物
src:存放项目源代码
可以通过 go get 下载最新版本的包到 src 目录下。
弊端:
无法做到多个项目依赖一个库的不同版本。

2、go vendor

项目目录下增加了 vendor 文件夹,所有依赖包以副本形式放在 $ProjectRoot/vendor 下。每个项目引入一份依赖的副本,如果找不到,再从GOPATH中寻找。
弊端:
无法很好解决依赖包版本变动问题和一个项目依赖同一个包的不同版本的问题。

3、go module

项目目录中引入 go.mod 文件,用来管理依赖包的版本,可以通过 go getgo mod 指令来管理依赖包。
go.module 文件结构如下: image.png module 路径(依赖管理基本单元):用来标识一个 module,从 module 路径可以看出从哪里找到该 module 。例如,如果以 github 为前缀开头,表示可以从 GitHub 仓库找到该 module 。依赖包的源代码由 GitHub 托管,如果项目的子包想被单独引用,则需要通过单独的 init go.mod 文件进行管理。
原生库:依赖的原生 Go SDK 版本。
单元依赖:每个依赖单元用 module路径 + 版本号 来唯一标识。\

依赖配置version:

1、语义化版本:

${MAJOR}.${MINOR}.${PATCH}
名称含义
MAJOR不同的MAJOR版本表示是不兼容API。即使是同一个库,MAJOR版本不同也会被认为是不同的模块
MINOR通常是新增函数或功能,向后兼容
PATCH一般是修复bug

2、基于commit伪版本

v0.0.0-yyyymmddhhmmss-abcdefgh1234
名称含义
v0.0.0版本前缀和语义化版本是一样的
yyyymmddhhmmss时间戳,提交Commit的时间
abcdefgh1234校验码,包含12位的哈希前缀

 // indirect 后缀:特殊标识符,表示当前 module 没有直接导入的包,也就是间接依赖。
+incompatible 后缀:特殊标识符。对于 MAJOR 主版本在 V2 及以上的模块,go.mod 会在模块路径增加 /vN 后缀,这能让 Go Module 按照不同的模块来处理同一个项目不同 MAJOR 主版本的依赖。
由于 Go Module 是在 Go 1.11 才实验性地引入,所以在这个更新提出之前,已经有一些仓库打上了 V2 或者更高版本的 tag 了。 为了兼容这部分仓库,对于没有 go.mod 文件并且 MAJOR 主版本在 V2 及以上的依赖,会在版本号后加上 +incompatible 后缀,表示可能会存在不兼容的源代码。 image.png

依赖图:

image.png

依赖分发-回源:

image.png 弊端:
无法保证构建稳定性(增加、修改、删除软件版本)
无法保证依赖可用性(删除软件)
增加第三方压力(代码托管平台负载问题)
解决方案: image.png 通过 Proxy 服务站点,缓存GitHub中的代码内容。构建项目是直接从Proxy中拉取依赖。

GOPROXY
GOPROXY = "https://proxy1.cn, https://proxy2.cn, direct"

Go Module 通过 GOPROXY 环境变量控制如何使用 Go Proxy 。
GOPROXY 是一个 Go Proxy 站点 URL 列表。direct 表示源站 (如 GitHub) ,proxy1proxy2 是两个URL 站点。依赖寻址路径为:优先从 proxy1 下载依赖,如果 proxy1 不存在,再从 proxy2 寻找,如果 proxy2 不存在,则会回源到源站直接下载依赖,并缓存到 Go Proxy 站点中。

go get 工具

image.png

go mod 工具

image.png

补充

从Go1.13版本开始,go module是Go语言默认的依赖管理工具。要启用go module支持首先要设置环境变量GO111MODULE,通过它可以开启或关闭模块支持,它有三个可选值:offonauto,默认值是 auto
可以通过命令:go env 查看当前开启状态;
GO111MODULE=off :禁用模块支持,编译时会从GOPATH和vendor文件夹中查找包。
GO111MODULE=on :启用模块支持,编译时会忽略GOPATH和vendor文件夹,只根据 go.mod下载依赖。
GO111MODULE=auto :当项目在$GOPATH/src外且项目根目录有go.mod文件时,开启模块支持。
Go1.11之后设置GOPROXY命令为:export GOPROXY=https://goproxy.cn
Go1.13之后GOPROXY默认值为 https://proxy.golang.org ,国内无法访问,建议设置 GOPROXYgoproxy.cn。命令如下:go env -w GOPROXY=https://goproxy.cn,direct

文章部分摘录自:blog.csdn.net/Sihang_Xie/…
用以记录和总结回顾。