go依赖管理学习 | 青训营笔记

135 阅读3分钟

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

|| 🎶今日笔记🎶 ||

项目笔记:依赖管理

  • 背景
  • 历史
  • 要素和模式
前言

了解Go依赖管理演进的历程,通过学习以及课后实践能够熟练使用 go module 管理依赖。

对于较简单的单体函数而言,只需要依赖原生的SDK即可完成开发

对于实际开发的工程较于复杂,应将精力投放在实现的业务逻辑之上


背景

什么是依赖管理?

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

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

  1. 因为我们不应该在这种地方浪费过多的时间
  2. 而且这个地方会非常浪费时间并且由于大量依赖使得非常的麻烦
  3. 最初的时候Go语言所依赖的所有的第三方包都放在 GOPATH 目录下面,这就导致了同一个包只能保存一个版本的代码,如果不同的项目依赖同一个第三方的包的不同版本,应该怎么解决呢?

历史

GoPath -- > Go Vendor --> Go Module

GoPath

是Golang支持的环境变量,GoPath下建立三个文件夹

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

项目代码之间依赖src下的代码可以通过go get下载最新版本的包到src下

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

Vendor

此时我们想到多建一个Vendor文件夹,将所有的依赖副本 放入 $ProjectRoot/vendor

此时如果我们的Vendor里没有才会去GOPATH下获取每个项目下都会引入一份依赖的副本

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

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

Go Module

此时,Go Module就应运而生了,它可以通过 go.mod 管理依赖包版本,通过 go get/go mod 指令工具来管理依赖包


要素和模式

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

依赖分发

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

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

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

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

  1. 无法保证构建的稳定性(代码作者可以对代码进行增加修改和删除)
  2. 无法保证依赖的可用性(代码作者可以对他的仓库进行删除)
  3. 会增加代码托管平台的压力
1. 配置文件,描述依赖 go.mod

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

3. 本地工具          go get/mod

依赖配置——go.mod

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

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

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

version版本的两种规则:

  1. 语义版本

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

例如:V1.3.0
复制代码
  1. 基于commit的伪版本

vX.0.0-yyyymmddhhmmss-abcdefgh1234

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

例如:v1.0.0-20220508130000-10c2456adasa

go get命令

在项目中执行go get命令可以下载依赖包,并且还可以指定下载的版本。

  • 运行go get -u将会升级到最新的次要版本或者修订版本(x.y.z, z是修订版本号, y是次要版本号)
  • 运行go get -u=patch将会升级到最新的修订版本
  • 运行go get package@version将会升级到指定的版本号version 如果下载所有依赖可以使用go mod download命令。

快速使用go module

  • SET GOPROXY=goproxy.cn (这是win环境下的) export GOPROXY=goproxy.cn (这是mac环境下的)
  • go mod init [包名] // 初始化项目(如果你是初始化项目直接 go mod init 就好了)
  • 在目录文件下会生成go.mod和go.sum文件 go.mod 里面包含了所有的包!
  • 在文件里面引入包名的时候有的编辑器会报错但是是可以正常编译的
  • 下载包使用go get
  • 修改包的版本号直接去go.mod文件修改然后go mod download

~ End ~