后端go笔记4: 依赖管理 |青训营

89 阅读1分钟

主要记录了go语言依赖管理的重点知识点:gopath弊端和go mod的指令和环境变量

参考材料:青训营课件,刘丹冰课件(补充)

GOPATH & Go Mod

GOPATH

弊端:

  • 没有版本控制概念:go get不能拉取指定版本,也不能存放版本信息
  • 无法保证和别人的代码同步第三方版本
  • 无法指定当前项目import的第三方版本号
  • 如果文件不在$GOPATH/src下则不能编译

Go Modules

指令

常见go mod 指令用途
go mod help获得目前版本支持的指令
go mod init生成go.mod文件
go mod vendor导出项目所有依赖包到vendor directory
go mod download下载go.mod文件中的所有依赖
go mod tidy整理现有依赖
go mod graph查看目前依赖结构
go mod edit编辑go.mod
go mod verify检查一个模块有没有被篡改过
go mod why查看为什么需要依赖某个模块
修改项目模块的依赖关系

go mod edit -replace=新的版本号后go.mod文件就会被修改

这个指令适用于由于有新的版本,想要改变现有go.mod的版本号的情况

基础环境变量

以下记录几个比较重要的go mod环境变量:

GO111MODULE

作为go mod的开关,有3种值可以设置:

  • auto(默认值): 只要项目包含go.mod就启用go mod
  • on:强制启动go mod (推荐设置)
  • off: 禁用go mod(假如想用gopath的话)

通过$ go env -w GO111MODULE=on设置

GOPROXY

用于设置go mod代理,可以直接通过镜像站点/第三方托管平台来快速通过import拉取包(比如github上的)

目前默认值: GOPROXY="https://proxy.golang.org,direct"

direct表示托管平台中如果找不到的话,会去源地址拉取

也可以用过$ go env -w GOPROXY=来设置

GOSUMDB (Go checksum database)

在拉取模块版本时,保证拉取到的版本数据未经过修改/完整的;如果不一致就立马中止

默认值: sum.golang.org

go.sum会储存所有检查并给zip文件生成的hash值

GONOPROXY/GONOSUMDB/GOPRIVATE

用在当前项目有依赖private repo的情况下,绕过goproxy和gosumdb来拉取,不然如果用proxy, sumdb会由于repo的私有性拉取失败(比如说项目依赖于学校/同学/公司私有的repo)

GOPRIVATE的值默认覆盖另外两个,通过go env -w GOPRIVATE=<地址>

初始化项目流程

  1. 开启go mod: go env -w GO111MODULE=on
  2. mkdir创建dir并cd进对应项目dir
  3. go mod init github.com/annadai/项目名
  4. 编写程序
  5. go get下载依赖的包,go.mod会自动保存依赖包的信息,go.sum也会同步更新 or 让程序自动down import的依赖包