这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
课程内容与选题缘由
回顾了一下之前的课程,打算巩固一下依赖管理的内容并总结过往踩过的坑方便以后查阅
GOPATH模式
GOPATH的特点
GOPATH是环境变量,GOPATH的路径下存放着三个文件夹:
- bin:项目代码的二进制文件
- pkg:项目编译后的二进制文件
- src:项目源代码、第三方包代码
在这种依赖模式下,所有代码都要放在GOPATH/src下,项目直接依赖于src下的代码。
go get 获取的最新第三方包是,代码直接下载至GOPATH/src ,然后根据这些源码编译并生成对应的二进制文件,存放在 GOPATH/bin 和 GOPATH/pkg 目录下。
GOPATH的弊端
- 所有代码都要存放在
GOPATH/src,否则项目无法编译 - GOPATH不能很好地管理多个项目之间的依赖关系,会导致代码重复和版本冲突,无法实现package的多版本控制。
Go Module模式
Go Module的特点
Go Module的依赖管理模式是目前最优且最主流的模式。
Go Module通过三个部分进行依赖管理:
- go.mod文件:描述依赖的配置文件
- Go proxy:管理依赖库
- go mod/get工具:获取第三方的依赖包
go.mod文件
Go.mod 文件是 Go Module 依赖模式的核心文件。
它包含以下几个部分:
- module:模块名称。
- require:依赖的模块及版本号。
- exclude:排除的模块。
- replace:替换的模块。
- go:Go 版本信息。
通过go mod 可以实现项目依赖的版本控制,可以确保项目的依赖稳定。
Go proxy
Go Proxy 是 Go Modules 的一种代理机制。它允许开发者在私有网络中缓存 Go Modules,并在网络不稳定或离线时使用依赖资源。
Go module模式下稳定的依赖分发就是 Go Proxy保证的。
有时候我们项目使用的第三方包在GitHub上以及发生变化,远程依赖发生更新,当项目再次拉去的时候可能会受到影响,Go Proxy则避免了这种可能性的发生。
Go Proxy 通过缓存和代理 Go Modules 来保证依赖分发的稳定性:
- Go Proxy 在本地缓存 Go Modules,当网络环境不稳定或离线时,可以从缓存中读取 Go Modules 而不是从远程源获取。
- Go Proxy 代理远程 Go Modules,当 Go Modules 的远程源不可用时,可以从 Go Proxy 中获取 Go Modules
- Go Modules 的依赖管理方式是通过指定版本号来管理依赖,Go proxy 会将依赖缓存在本地,并不会更新,这样就能保证依赖稳定,避免因为远程依赖的更新导致项目编译失败
go mod常用命令
go mod init //初始化当前目录为 Go 模块,并在当前目录下创建 go.mod 文件
go mod tidy // 整理当前项目的依赖,移除不需要的依赖并添加缺失的依赖
go mod download: //下载项目的所有依赖模块并存储到本地的 vendor 目录中
go mod graph // 打印项目依赖关系图
go mod edit //编辑 go.mod 文件。
go mod vendor: //将项目依赖的模块复制到 vendor 目录
go mod verify // 检查当前项目依赖的模块是否有效
go get 常用命令
go get <package> //下载并安装指定的包
go get -u <package> // 更新指定的包
go get package@version //下载并安装指定版本的包
go get github.com/golang/example@v1.2.3