Go module依赖下载

news/2024/6/17 18:43:41 标签: golang, 开发语言, 后端, go mod, go proxy
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也一样),会包含以下标准格式信息:

<meta name="go-import" content=" github.com/json-iterator/go git " target="_blank">https://github.com/json-iterator/go.git">

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

<meta name="go-import" content="root-path vcs repo-url">

得知,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模式。


http://www.niftyadmin.cn/n/146837.html

相关文章

Spring6的新特性,正式“抛弃”feign了

多数网友在对接第三方系统时&#xff0c;还在使用 httpclient、okhttp 等方式进行硬编码的形式实现对接。其实&#xff0c;我认为使用 feign 来实现更为方便快捷。feign 除了服务间的 http 调用外&#xff0c;还支持非服务间的 http 调用。只是&#xff0c;我们的一些思维还未转…

【Python+Request+Pytest】接口自动化测试脚本要点总结

文章结合视频观看效果最好&#xff0c;接口自动化测试视频学习地址&#xff1a;https://www.bilibili.com/video/BV1914y1F7Bv/? 目录&#xff1a;导读 一、框架搭建流程 1. 封装接口请求 2. 存储接口信息 3. 封装登录和其他方法 4. 使用Pytest管理测试用例 5. 添加日志…

19c数据库current redo文件损坏的恢复

数据库平台&#xff1a;Oracle Linux 8.7 数据库版本&#xff1a;19.3.0.0.0 数据库故障场景&#xff1a;current redo文件损坏的修复 [oracledkf ~]$ [oracledkf ~]$ cat /etc/redhat-release Red Hat Enterprise Linux release 8.7 (Ootpa) [oracledkf ~]$ 登录查看数据…

vue+Echarts绘制k线图(二)--分时图和交易量图

目录1 前言2 分时图2.1 vue引入Echarts2.2 分时图介绍2.3 分时折线图配置2.4 组合交易量图2.5 鼠标指示数据设置2.6 项目完整代码3 总结1 前言 近来发现Echarts API越发的强大&#xff0c;对于绘制各类图形可以使用Echarts实现&#xff0c;前面已经介绍了柱状图、饼状图、折线…

MySQL高级第二篇:索引的分类及MyISAM与InnoDB中的索引对比

MySQL高级第二篇&#xff1a;索引的分类及MyISAM与InnoDB中的索引对比一、索引的分类1. 聚簇索引2. 非聚簇索引&#xff08;二级索引&#xff0c;辅助索引&#xff09;3. 联合索引&#xff08;也属于非聚簇索引&#xff09;二、InnoDB的 B 树索引注意1. 根页面位置始终不变2.内…

初学pinia

pinia与 Vuex 的比较 Pinia 最初是为了探索 Vuex 的下一次迭代会是什么样子&#xff0c;结合了 Vuex 5 核心团队讨论中的许多想法。最终&#xff0c;我们意识到 Pinia 已经实现了我们在 Vuex 5 中想要的大部分内容&#xff0c;并决定实现它 取而代之的是新的建议。 与 Vuex 相比…

docker—启动、停止、重启容器实例

docker—启动、停止、重启容器实例一、启动一个已经停止的容器实例二、停止一个正在运行的容器实例三、重启一个容器实例一、启动一个已经停止的容器实例 先查看已经暂停的容器实例信息docker ps -a通过docker start xxx启动容器通过docker ps查看当前启动的容器 二、停止一…

分布式Id生成方式

为什么要用分布式ID&#xff1f; 在说分布式ID的具体实现之前&#xff0c;我们来简单分析一下为什么用分布式ID&#xff1f;分布式ID应该满足哪些特征&#xff1f; 1、什么是分布式ID&#xff1f; 拿MySQL数据库举个栗子&#xff1a; 在我们业务数据量不大的时候&#xff0c…