Go语言课程笔记之依赖管理|青训营笔记

104 阅读2分钟

这是我参与「第五届青训营」笔记创作活动的第5天,今天我将总结一下Go语言中依赖管理的相关概念,主要从Go语言依赖管理的演进Go Module的使用两方面来进行总结。

Go语言依赖管理的演进

Go Path

简介

是一个环境变量,结构一般为: bin:项目编译的二进制文件 pkg:项目编译的中间产物,用于加速编译 src:项目源码

依赖管理原理

项目代码直接依赖于src下的代码,使用go get下载下载最新版本的包至src目录下。

弊端

无法实现package的多版本控制。

Go Vendor

依赖管理原理

在项目目录下添加vendor文件,所有依赖包副本形式放在$ProjectRoot/vender中 依赖寻址方式:vender=>GOPATH

优点

通过每个项目引入一份依赖的副本,解决了需要同个package依赖的冲突问题。

弊端

无法控制依赖的版本,更新项目可能会出现依赖冲突,导致编译出错

Go Module

简介

通过go.mod文件管理依赖包版本,通过go get/go mod指令工具管理依赖包

优点

可以定义版本规则和管理项目依赖关系


Go Module的使用

依赖管理三要素

  • 配置文件,描述依赖:go.mod
  • 中心仓库管理依赖库:Proxy
  • 本地工具:go get/mod

依赖配置

go.mod

module example/project/app  //依赖管理基本单元

go 1.16  //原生库

require(
  example/lib v1.0.0
  ...  //标识依赖:[Module Path][Version/Pseudo-version]
)

version的定义

  1. 语义化版本:${MAJOR}.${MINOR}.${PATCH} MAJOR版本:大版本,不同MAJOR代码之间可能不兼容 MINOR版本:小版本,一般可能新增函数,需要做到至少向下兼容 PATCH版本:BUG修复版本,一般做一些代码Bug修复
  2. 基于commit伪版本:vX.0.0-yymmddhhmmss-哈希码 //前面类似于语义化版本

Go依赖管理工具

Go get

go get example.org/pkg [@update|@none|@v1.0.0|@23dffdd5|@master]

Go mod

go mod [init|download|tidy]

注:在实际开发过程中,尽量提交之前执行下 go tidy ,减少构建时无效依赖包的拉取。

使用go mod需要开启:go env中默认GO111MODULE=off 此时go命令行将不会支持module功能,将会沿用旧版本通过vendor目录或GOPATH模式来查找

GOPROXY

从下图可以看到Go语言通过Proxy这种开源代理服务器进行依赖包下载。 image.png

开启Go mod与GOPROXY设置

之前初接触踩坑记中也写过需要在cmd中修改几个go的参数:

go env -w GO111MODULE=on  
go env -w GOPROXY=https://goproxy.cn,direct

现在也可以解释其原因了...