这是我参与「第五届青训营 」伴学笔记创作活动的第1天
使用GOPATH管理
设置环境变量$PATH,项目代码会直接依赖$PATH/src下的代码,go get下载的包也会放在src目录下,但是用这种方式进行管理时无法实现一个包的多版本依赖
使用Go Vendor管理
项目的目录下增加vendor目录,存放依赖的包的副本,这样可以实现多个项目需要同一个包的不同版本的依赖冲突,但是这种管理方式不方便控制依赖版本
使用Go Module管理
为了解决之前方案存在的问题,Go官方自1.16默认开启
Go Module引入了go.mod文件来记录所写模组所需的依赖,形式如下:
module douyin
go 1.19
require (
github.com/appleboy/gin-jwt/v2 v2.9.1
github.com/cloudwego/fastpb v0.0.3
github.com/cloudwego/kitex v0.4.4
...
)
require (
github.com/apache/thrift v0.13.0 // indirect
github.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f // indirect
github.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733 // indirect
...
)
其中的版本有两种写法:vX.Y.Z以及基于commit的v0.0.0-20220608213341-c488b8fa1db3(版本-时间-commit哈希)
某些行后面的indirect间接依赖,例如douyin依赖于kitex,而kitex又依赖于thrift,所以douyin对thrift存在间接依赖,go.mod用注释的形式标明了这种依赖
作为现代化的语言,与C/C++很大的不同在于,Go的模组能直接通过官方提供的命令行工具从网上下载,一般而言Go的依赖大量来自于github.com以及golang.org等平台,为了保证依赖的稳定性、可用性以及缓解第三方平台的压力,Go支持从Proxy服务器上下载,这些服务器具有所需依赖对应版本的缓存
Go提供了两个本地工具来管理依赖,分别是go mod和go get
go mod支持go.mod的创建、维护以及整理go get用来下载指定版本的go模组