• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Go 进阶和依赖管理02 | 青训营

武飞扬头像
Selfdiscipline
帮助3

2.3.1 依赖配置-go.mod

学新通

首先模块路径(依赖管理基本单元)用来标识一个模块,从模块路径可以看出从哪里找到该模块,如果是github前缀则表示可以从Github 仓库找到该模块,依赖包的源代码由githu托管,如果项目的子包想被单独引用,则需要通过单独的go.mod文件进行管理。
下面是依赖的原生库sdk版本(go 1.16)
最下面是单元依赖(最关键的部分),每个依赖单元用模块路径(跟上面的对应) 版本来唯一标示。

2.3.2 依赖配置-version

学新通 gopath和govendor都是源码副本方式依赖,没有版本规则概念
而gmod为了方便版本管理 定义了版本规则,分为语义化版本和伪版本

其中语义化版本包括三部分,

不同的MAJOR大版本可以表示是不兼容的 所以即使是同一个库,MAJOR 版本不同也会被认为是不同的模块
MINOR版本通常是新增函数或功能,需要保持在MAJOR下做到前后兼容
patch 版本一般是修复 bug ;

基于commit的伪版本包括3部分,

版本前缀是和语义化版本一样的;
时间戳 yyyymmddhhmmss,也就是提交commit的时间,
最后是校验码(abcdefabcdef,包含 12 位的哈希前缀;每次提交commit后 Go 都会默认生成一个伪版本号

2.3.3 依赖配置-非直接依赖indirect

下面我们再来看下依赖单元中的特殊标识符,首先是indirect后缀
表示go.mod对应的当前模块,没有直接导入该依赖模块的包, 也就是非直接依赖,标示间接依赖,例如 学新通

2.3.4 依赖配置-incompatible

学新通 下一个常见是的是incompatible
主版本2 模块(v2以上) 会在模块路径增加/vN(v1,v2这种后缀),这让gomod按照不同的模块来处理同一个项目不同主版本的依赖(允许不同MAJOR版本间相互兼容)
由于gomod是1.11实验性引入,所以这项提出之前已经有一些仓库打上了v2或者更高版本的tag了,为了兼容这部分仓库,对于没有go.mod文件并目主版本在2或者以上的依赖,会在版本号后加上 incompatible 后缀
前面讲语义化版本提到,对于同一个库的不同的major版本,需要建立不同的pkg目录,用不同的gomod文件管理,
如下面仓库为例,V1版本gomod在主目录下,而对于V2版本,则单独建立了V2目录,用另一个gomod文件管理依赖路径,来表明不同major的不兼容性。
那对于有些V2 tag版本的依赖包并未遵循这定义规则,就会打上incompatible标志,增加一个compatile的case

依赖图

学新通 c。 答案竟然是B。

Go底层会根据自己的算法 选择最低的兼容版本

2.3.5 依赖分发-回源

gomodule的依赖分发,也就是从哪里下载,如何下载的问题
github是比较常见给的代码托管系统平台,而Go Modules 系统中定义的依赖,最终可以对应到多版本代码管理系统中某一项目的特定提交或版本,这样的话,对于go.mod中定义的依赖,则直接可以从对应仓库中下载指定软件依赖,从而完成依赖分发。
但直接使用版本管理仓库下载依赖,存在多个问题
首先无法保证构建确定性:软件作者可以直接码平台增加/修改/删除 软件版本,导致下次构建使用另外版本的依赖,或者找不到依赖版本。
无法保证依赖可用性:依赖软件作者可以直接代码平台删除软件,导致依赖不可用;大幅增加第三方代码托管平台压力学新通

2.3.5 依赖分发-Proxy

而go proxy就是解决这些问题的方案,Go Proxy 是一个服务站点
它会缓存源站中的软件内容,缓存的软件版本不会改变,并且在源站软件删除之后依然可用,从而实现了供“immutability”和“available”的依赖分发;
使用 Go Proxy 之后,构建时会直接从 Go Proxy 站点拉取依赖。
类比项目中,如果下游无法满足我们上游的需求、接口,我们可以建一层适配器或Proxy解决 学新通

2.3.6 依赖分发-变量-GOPROXY

下面讲一下go proxy的使用,Go Modules通过GOPROXY环境变量控制如何使用 Go Proxy;GOPROXY是一个Proxy 站点URL列表,可以使用 “direct”表示源站 用逗号分隔。
对于示例配置,整体的依赖寻址路径,会优先从proxy1下载依赖,如果proxy1不存在,后下钻proxy2寻找,如果proxy2,中不存在则会回源到源站直接下载依赖,缓存到proxy站点中。 学新通

2.3.7 工具-go get

对go module的管理工具介绍下使用,首先是go get 学新通

2.3.8 工具-go mod

go mod,尽量提交之前执行下go tidy,减少构建时无效依赖包的拉取 学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfgkkek
系列文章
更多 icon
同类精品
更多 icon
继续加载