Go(Golang)_14_依赖管理

依赖管理

GOPATH

GOPATH:用户项目的工作目录

1)GOPATH可设置多个(第一个作为默认)

2)GOPATH多用于存储第三方库和项目源代码

3)GOPATH/src是源码、GOPATH/pkg是编译文件、GOPATH/bin是可执行文件

//GOPATH缺点:多个项目无法共用同一个GOPATH


GOROOT:Go编译器和标准库的安装路径

1)GOROOT与GOPATH的值不可相同(防止产生歧义);

2)可直接通过修改GOROOT实现Go的升级;

3)GOROOT也是Go项目的顶级目录;


vendor

vendor:项目的私有GOPATH(集合式管理项目的依赖)

1)项目可拥有多个vendor目录,但须位于不同的目录级别;

2)项目在被发布时,会连同其vendor目录打包发布;

3)vendor依赖于GOPATH;

//vendor缺点:依赖关系不清晰和二进制文件过大


项目使用vendor后搜索依赖的顺序:

1)在源码的同级目录下查找vendor目录;

2)向上级目录依次查找,直至查找到vendor目录;

3)若无vendor目录,则先GOPATH后GOROOT查找;


module

module:记录被同时标记版本号的包的集合

1)仓库可拥有多个module,但module必须遵循语义化版本规范;

2)module可精确记录依赖版本号和其Hash值(可重复构建);

3)module和GOPATH/vendor不能共存(建议使用module)

//可重复构建保证项目在任何环境下构建产物都相同


语义化版本(Semantic Versioning)v(大版本号).(小版本号).(补丁版本号)

1)大版本号:发生不兼容改动时增加;

2)小版本号:增加新特性时增加;

3)补丁版本号:修复bug时增加;

//module同时规定当大版本号大于1时,需显示标记在项目名中


module存储依赖的目录:GOPATH/pkg/mod

1)该目录下每个依赖和依赖的每个版本都单独占用个目录存储(多版本共存)

2)所有目录名均为小写(大写会转换为对应的小写,如:A !a)

3)GOPATH/pkg/mod/cache目录:存储各个依赖的缓存


go.mod

go.mod:记录module名字、依赖信息和项目开发时的Go版本号

1)go.mod文件可手动创建也可使用命令创建

2)命令创建go.mod文件:go mod init 项目名字

3)通过go get/go build等命令获取依赖时,会自动更新go.mod

4)当go.mod缺失依赖或依赖不匹配时,会自动选择依赖的最新版本

5)go.mod依赖版本会根据其他依赖包的依赖发生改变(最小可用版本)


go.mod文件由4个指令构成:

(1)module:指定项目名称


(2)require:指定依赖

1)多个require指令可使用括号合并;

2)go get和go build会根据该依赖信息获取特定版本;


(3)replace:替换require中指定的依赖

1)replace仅在当前module未main module时有效(引用编译时失效);

2)replace指令中指定被替代的依赖必须出现require中,否则无效;

3)replace指令可实现隐藏依赖版本号和禁止直接引用;

4)多个replace指令可使用括号合并;


(4)exclude:排除指定依赖的特定版本

1)exclude仅在当前module未main module时有效(引用编译时失效);

2)排除版本后默认选择更新版本(没有则报错);

3)多个exclude指令可使用括号合并;


如:web项目module

module web

go 1.17

require (
    gihub.com/go-sql-driver/mysql v1.6.7
    github.com/qiniu/go-sdk/v7 v7.11.1
    github.com/dgrijalva/jwt-go v3.2.0+incompatible
    github.com/BurntSushi/toml v1.0.0
)

require golang.org/x/sync v0.0.-20201207232520-09787c99a3a // indirect

repalce github.com/go-sql-drivermysql v1.6.7 => github.com/go-sql-driver/mysql 1.6.8

exclude github.com/qiniu/go-sdk/v7 v7.11.0

go.mod上的特殊标注:

(1)// indirect:间接的依赖

1)不是所有的间接依赖均出现在go.mod文件中;

2)满足以下条件者会在go.mod文件中标为间接依赖;

间接依赖
依赖未使用module,同时依赖其他包
依赖的go.mod文件中缺失的部分依赖

(2)+incompatible:不规范依赖

1)不规范依赖常指其依赖未遵循module的语义化版本;


(3)伪版本(commit ID):依赖发布新版本但未更新版本号

1)go.mod中伪版本格式:语义化版本-提交时间-commit ID的前12位

2)go get获取也需指定commit ID(否则获取未更新版本)


go.sum

go.sum:记录go.mod和所有依赖整体的Hash值(实现准确记录版本)

1)go.sum文件仅能由其他命令创建和修改;

2)每修改/添加依赖后会添加go.mod和所有依赖整体的Hash值;

3)go.sum会记录所有构建使用的依赖版本(包括任何间接依赖);


go.sum文件的内容格式:

依赖名 版本号 Hash算法:Hash值

依赖名 版本号/go.mod Hash算法:Hash值

1)Hash算法常为“h1”,代表使用的SHA-256;

2)若无go.mod文件,则仅会记录依赖的Hash值;

3)构建项目时会向GOSUMDB指定服务器获取Hash值进行对比;

//若设置GOSUMDB环境变量,则在写入go.sum前也会进行次对比


GOPROXY

GOPROXY:通过镜像服务器获取依赖

1)任何实现代理协议的Web服务器均可充当GOPROXY代理

2)推荐使用的镜像服务器地址:

镜像服务器地址说明
goproxy.cn七牛云提供
mirrors.tecent.com/go腾讯云提供
mirrors.aliyun.com/go阿里云提供

GOPROXY环境变量须知:

1)可指定多个镜像服务器,之间使用逗号分隔(依次尝试获取);

2)行尾指定“direct”,代表镜像服务器无依赖时从源地址获取;


GOPROXY的代理协议:

(1)响应GET $GOPROXY/<module>/@v/list

1)作用:返回当前代理服务器中该模块列表;

2)$GOPATH/pkg/mod/cache/download/<module>/@v/list下每行记录个版本;


(2)响应GET $GOPROXY/<module>/@v/<version>.info

1)作用:返回当前代理服务器中特定版本的模块元素数据;

2)元数据使用Info结构体表示(记录版本号和该版本事件);


(3)响应GET $GOPROXY/<module>/@v/<version>.mod

1)作用:返回当前代理服务器中特定版本模块的go.mod文件


(4)响应GET $GOPROXY/<module>/@v/<version>.zip

1)作用:返回当前代理服务器中特定版本模块的压缩包;

2)压缩包仅包含该版本的文件(不包含版本控制信息);


(5)响应GET $GOPROXY/<module>/@last

1)作用:返回最新可用版本的元数据;

2)该协议可忽略;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值