Go Module依赖管理 | 青训营笔记

188 阅读4分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记

😆在这里,我对今天的课所新学到的Golang依赖管理做了一次总结

😜Golang的其他知识在哪里找呢,那你就问对了

👨‍💻Golang基础复习 - 掘金 (juejin.cn) 在这里我总结了一些这篇文章没有提到的一些知识

😊如果有小伙伴能想到更多知识,欢迎大家在评论区留言,那么我们就开始吧

👩‍💻👨‍💻哟西,一个棕~

😎😎😎我是小小分割线

背景

依赖管理是什么呢?

如果你曾经是一个java后端工程师,你一定知道Maven这个依赖管理工具

如果你曾经是一个安卓工程师,你一定知道Gradle这个依赖管理工具

那么我们现在就来介绍一下,为什么要用依赖管理

因为我们不应该在这种地方浪费过多的时间

而且这个地方会非常浪费时间并且由于大量依赖使得非常的麻烦

最初的时候Go语言所依赖的所有的第三方包都放在 GOPATH 目录下面,这就导致了同一个包只能保存一个版本的代码,如果不同的项目依赖同一个第三方的包的不同版本,应该怎么解决呢?

历史

GoPath -- > Go Vendor --> Go Module

在GoPath中

是Golang支持的环境遍量

GoPath下建立三个文件夹

分别是 bin:编译的二进制文件、pkg:项目编译的中间产物,加速编译、src:项目源码

项目代码之间依赖src下的代码

可以通过go get下载最新版本的包到src下

弊端:如果项目A和项目B依赖于同一个包的不同版本,也就是无法实现package的多版本控制

此时我们想到多建一个Vendor文件夹

将所有的依赖副本 放入 $ProjectRoot/vendor

此时如果我们的Vendor里没有才会去GOPATH下获取

每个项目下都会引入一份依赖的副本

此时解决了多个项目需要同一个package依赖的冲突问题

但是此时也有弊端:无法控制依赖的版本,更新项目可能会出现依赖冲突,导致编译错误

此时,Go Module就应运而生了

它可以通过 go.mod 管理依赖包版本

通过 go get/go mod 指令工具来管理依赖包

依赖管理三要素

1. 配置文件,描述依赖 go.mod

2. 中心仓库管理依赖库 Proxy

3. 本地工具           go get/mod

依赖配置——go.mod

一个go.mod由三个部分组成:依赖管理基本单元、原生库、单元依赖

其中,最重要的是单元依赖

单元依赖通常由两部分组成:ModulePath和版本号

version版本的两种规则:

  1. 语义版本

${MAJOR}.${MINOR}.${PATCH}

例如:V1.3.0

2. 基于commit的伪版本

vX.0.0-yyyymmddhhmmss-abcdefgh1234

版本前缀 + 时间戳 + 12位哈希校验码

例如:v1.0.0-20220508130000-10c2456adasa

依赖版本的选择

image.png

答案:B

根据Golang版本选择的算法,Golang会选择一个最低兼容版本,他们同属于V1版本,而1.4是同时满足的最低版本

依赖分发

我们可以在github等代码托管平台中下载我们需要的依赖

我们使用的每一个依赖都可以对应到代码托管平台的某一次提交

对于go.mod中的某一依赖我们可以做到直接从代码托管平台中下载来完成依赖分发

但是直接使用代码管理平台来下载我们需要的依赖的话会有一定的缺陷

  1. 无法保证构建的稳定性(代码作者可以对代码进行增加修改和删除)

  2. 无法保证依赖的可用性(代码作者可以对他的仓库进行删除)

  3. 会增加代码托管平台的压力

这时我们可以使用Proxy缓存代码平台的内容,也可以保证稳定性和可靠性

如果我们使用了Proxy,我们就会直接先从Proxy中拉取

GoProxy

GoProxy时Go.mod中的一个环境变量

我们可以这样设置

GOPRPOXY="站点一,站点二,站点三,direct"

此时我们会依次查找,知道站点三也没有那我们会direct回到源站

关键字

indirect关键字用来表明是非直接依赖

incompatible关键字:对于 没有go.mod文件并且主版本2+ 的依赖,会+incompatible,作为一个标识


工具

go get

使用方式:

go get 依赖 @参数

如果我们直接这样不加其他参数,那么我们默认是update,下载最新版,亦或者是升级

如果加上一个none参数,那么就是删除依赖

如果加上一个版本号,就会指定版本

如果加上一个commit号就会指定commit

如果加上一个分支名,就会指定那个分支的最新commit

go mod

使用方式:

go mod 操作

有以下三种操作

init 初始化,会创建go.mod文件

download 下载模块到本地缓存

tidy 增加需要的依赖,删除不需要的依赖

😎😎😎又是我,我还是小小分割线

都用心看到这里了,那就求个赞吧😘

🥳🥳🥳如果小伙伴有其他的小知识,一定不要忘了在评论区讨论哟,多多讨论,生态才会越来越好