Go module依赖下载
创始人
2024-06-02 23:45:01
require (github.com/json-iterator/go v1.1.12
)

疑问

假设go.mod中引入了以上这个依赖,那么go会如何去拉取依赖呢?

Go的下载途径

在回答这个问题之前,首先需要明确一点,go下载的依赖途径有两个:

  • 从vcs下载,例如从git 、svn这些版本控制系统中直接clone并将module下载到$GOPATH/pk/mod下。

  • 从proxy下载,从一个代理服务器中下载已经缓存的module包,代理proxy中存储了$GOPATH/pk/mod中的一样的内容,供开发者下载。proxy中没有开发者需要的module,那么proxy会从vcs更新该module信息。

VCS模式

有两种方式可以使github.com开头的module从vcs中下载:

//1、关闭代理
GONOPROXY=github.com//2、设为私有库,即将GONOPROXY和GONOSUMDB统一设置为github.com
GOPRIVATE=github.com

以 github.com/json-iterator/go 这个module依赖为例,描述一下vcs模式下载包的过程:

1、首先go会发现github.com开头关闭了代理,走vcs模式。因此直接在module 路径后加一个?go-get=1,发出一个Get请求,如下:

https://github.com/json-iterator/go?go-get=1

此时github返回的html文档中(其他gitlab/gitee/svn也一样),会包含以下标准格式信息:

https://github.com/json-iterator/go.git">

go会根据一下模版去解析内容:

得知,repo-url为https://github.com/json-iterator/go.git仓库,确定仓库位置后,然后再从中选择tag v1.1.12进行clone,保存在本地的pkg/mod下。

Proxy模式

同样以 github.com/json-iterator/go v1.1.12这个module依赖为例:

需保证GOPRIVATE和GONOPROXY中没有设置github.com,那么go就会去proxy中寻找该module。

proxy的地址,由下面环境变量指定:

GOPROXY=https://proxy.golang.org,direct

1、go先去https://proxy.golang.org这个代理中寻找,寻找的Get请求是:

https://proxy.golang.org/github.com/json-iterator/go/@v/v1.1.12

proxy接收到该请求,根据url中的路径去寻找目录github.com/json-iterator/go下的module依赖,有就返回。没有的话proxy就会开启vcs模式,按vcs模式的步骤去下载github.com/json-iterator/go 这个module,下载完后,返回给开发者。

2、假如proxy(https://proxy.golang.org)返回4xx,那么就会走下一个代理。本例子中下一个代理是direct指令。direct指令就是表示直接走vcs模式。

相关内容

热门资讯

苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...