Go Module解决包依赖以及应用构建

466 阅读2分钟

Go构建模式演化

GOPATH -> GO MODULE

GOPATH 构建弊端

该模式下 go编译器会在配置好的环境变量下的路径搜索第三方依赖包是否存在。 如过不存在则 通过go get命令下载到本地

  • 弊端一 :go get 每次都会下载最新版本的包,所以不同开发者在不同时间编译时则可能导致不兼容问题。
  • 弊端二:若第三方依赖包无法通过编译且作者为及时修复会导致本地程序无法通过编译

补救方式: vendor 机制:将Go项目所有的依赖包缓存到该目录下。

弊端:

  • vendor目录下的依赖包过多会导致提交代码时文件过大,影响代码仓库工作效率。
  • 需要手动管理vendor下的依赖包。

类似 java 有maven管理依赖包,go 增加了 Go Module构建模式。

Go Module 构建

Go Module对应 一个Go包的集合,Go Module的顶层目录下 会有go mod文件,里面定义module ,go 版本以及通过require命令 导入所依赖的包

module projects

go 1.16

require github.com/xxxxprojects/xxx vX.Y.Z

构建流程

# 创建go.mod文件
go mod init
# 更新module依赖信息,并下载所需要的依赖的包
go mod tidy
# 构建
go build

国内源通过修改GOPROXY环境变量加速下载 设置GO111MODULE环境变量的值可切换GO Module 和 GOPATH 构建方式 go 禁止循环依赖

Go Module 应用场景

  • import 报错,需添加依赖包
# 方式一
go get github.com/xxx/xxx v.1.1.1
# 方式二 自动分析源码下载
go mod tidy 

  • 调整依赖版本
#  方式一
go get github.com/xxx/xxx@v.1.1.1
# 方式二 
go mod edit -require=github.com/xxx/xxx@v1.1.1
go mod tidy

  • 移除依赖
# 自动分析源码依赖移除,1.8版本后不用手动输入命令go mod tidy
go mod tidy

  • 内网场景构建
# 利用vendor本地缓存,go mod vendor将项目的依赖库下载到项目内部,作为项目的一部分来编译。
go mod vendor