Go语言-- 版本管理go module以及go.sum详解

news2024/11/14 18:50:25

为了确保一致性构建,Go语言中引入了go.mod文件来标记每个依赖包的版本,在构建过程中go命令会下载go.mod中的依赖包,下载的依赖包会缓存在本地,以便下次构建。

在进行go语言项目开发的时候,会依赖3种类型的库包:

  • 内置的标准库包,在goroot/src目录下,也就是我们安装目录的src目录下(类似于python的bin目录)
  • 第三方库包(git上开源的)
  • 项目中的库包,也就是项目中的其他目录。自己调用自己写的函数方法

生成go.mod文件

确保go版本>=1.11

在项目的根目录下,执行go mod init xxxx
xxxx为对应的项目名称。
例如:我们创建一个geecache的项目,在命令行执行go mod init geecache

在这里插入图片描述

此时,项目目录就产生了go.mod

在这里插入图片描述

go.sum

为了解决Go module的这一安全隐患,Go开发团队在引入go.mod的同时也引入了go.sum文件,用于记录每个依赖包的哈希值,在构建时,如果本地的依赖包hash值与go.sum文件中记录得不一致,则会拒绝构建。

  • 执行go mod tidy命令,会生成go.sum文件

在这里插入图片描述
在这里插入图片描述

go.sum文件详解

go.sum文件中每行记录由module 名, 版本和哈希组成,并由空格分开,格式如下:

<module> <version>[/go.mod] <hash>

例如:上述go.sum中就记录了github.com/golang/protobuf这个依赖v1.3.3版本的哈希值:

github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=

通常,每个依赖包版本会包含两条记录:

  • 第一条为该依赖包版本整体(所有文件)的哈希值,
  • 第二条仅表示该依赖包版本中go.mod文件的哈希值
    如果该依赖包版本没有go.mod文件,则只有第一条记录。如上面的例子中,v1.3.3 表示该依赖包版本整体,而v1.3.3/go.mod表示该依赖包版本中go.mod文件。

依赖包版本中任何一个文件(包括go.mod)改动,都会改变其整体哈希值,此处再 **额外记录依赖包版本 **的go.mod文件主要用于计算依赖树时不必下载完整的依赖包版本,只根据go.mod即可计算依赖树。go.mod只需要记录直接依赖的依赖包版本,只在依赖包版本不包含go.mod文件时候才会记录间接依赖包版本。而go.sum则是要记录构建用到的所有依赖包版本。

校验

假设我们拿到某项目的源代码并尝试在本地构建,go命令会从本地缓存中查找所有go.mod中记录的依赖包,并计算本地依赖包的哈希值,然后与go.sum中的记录进行对比,即检测本地缓存中使用的依赖包版本是否满足项目go.sum文件的期望。

如果校验失败,说明本地缓存目录中依赖包版本的哈希值和项目中go.sum中记录的哈希值不一致,go命令将拒绝构建。 这就是go.sum存在的意义,即如果不使用我期望的版本,就不能构建。

当校验失败时,有必要确认到底是本地缓存错了,还是go.sum记录错了。 需要说明的是,二者都可能出错,本地缓存目录中的依赖包版本有可能被有意或无意地修改过,项目中go.sum中记录的哈希值也可能被篡改过。

当校验失败时,go命令倾向于相信go.sum,因为一个新的依赖包版本在被添加到go.sum前是经过GOSUMDB(校验和数据库)验证过的。此时即便系统中配置了GOSUMDB(校验和数据库),go命令也不会查询该数据库。

校验和数据库

环境变量GOSUMDB标识一个checksum database,即校验和数据库,实际上是一个web服务器,该服务器提供查询依赖包版本哈希值的服务。

该数据库中记录了很多依赖包版本的哈希值,比如Google官方的sum.golang.org则记录了所有的可公开获得的依赖包版本。除了使用官方的数据库,还可以指定自行搭建的数据库,甚至干脆禁用它(export GOSUMDB=off)。

如果系统配置了GOSUMDB,在依赖包版本被写入go.sum之前会向该数据库查询该依赖包版本的哈希值进行二次校验,校验无误后再写入go.sum

如果系统禁用了GOSUMDB,在依赖包版本被写入go.sum之前则不会进行二次校验,go命令会相信所有下载到的依赖包,并把其哈希值记录到go.sum中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1982397.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用ThreadLocal来存取单线程内的数据

一.什么是ThreadLocal&#xff1f; ThreadLocal&#xff0c;即线程本地变量。如果你创建了一个 ThreadLocal变量&#xff0c;那么访问这个变量的每个线程都会有这个变量的一个本地拷贝&#xff0c;多个线程操作这个变量的时候&#xff0c;实际是在操作自己本地内存里面的变量&…

Selenium+Python自动化测试:解决无法启动IE浏览器及报错问题

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 前言&#xff1a;记录启动IE浏览器的报错及解决方法。 错误1&#xff1a; selenium.common.exceptions.WebDriverException: Message: IEDriverServer.exe execu…

MySQL:索引(Index)语句

索引的限制 每个表最多可以有 16 个索引&#xff08;InnoDB 表的限制&#xff09;。 单个索引最多可以包含 16 列。 索引列的最大长度为 767 字节&#xff08;对于 CHAR, VARCHAR, 和 BINARY 类型&#xff09;&#xff0c;3072 字节&#xff08;对于 BLOB 类型&#xff09;。…

网鼎杯比赛二次注入技巧

文章目录 前端的网页展示分析题目暴力破解寻找代码找到注入点进行注入查询想要的文件 前端的网页展示 分析题目 1.目前我们能看到的只有三个页面&#xff0c;但是我们可以看到三个*号。 2.考虑三个*的密码是什么&#xff0c;这里可以采用暴力破解&#xff08;我们先猜这是三个…

【精选】6款一键生成论文的软件3000字论文网站

千笔-AIPassPaPer是一款功能强大且全面的AI论文写作工具&#xff0c;特别适合学术研究者和学生使用。它不仅能够一键生成高质量的论文初稿&#xff0c;还涵盖了700多个学科专业方向&#xff0c;满足各种学术需求。 一、千笔-AIPassPaPer 传送门&#xff1a;https://www.aipape…

Codeforces Round 963 (Div. 2) A-C

A. Question Marks 直接模拟一遍&#xff0c;&#xff1f;跳过&#xff0c;其他统计 #include<iostream> #include<cstring> #include<string> #include<algorithm> #include<map> using namespace std; int t, n; int w[200005]; int main() …

论文辅导 | 基于概率密度估计与时序Transformer网络的风功率日前区间预测

辅导文章 模型描述 本文所提出的时序优化Transformer 结构&#xff0c;该模型从结构上看由三部分组成&#xff1a;向量映射、编码器和解码器。编码器输入为数值天气预报数据以及相应的时间编码。解码器输入为预测日之前输出功率历史数据以及相应的时间编码。这些数据在经过向量…

【C++高阶】深入理解C++异常处理机制:从try到catch的全面解析

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;Lambda表达式 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀C异常 &#x1f4d2;1. C异常概念…

MySQL基础:int(1) 和 int(10) 有什么区别

在数据库设计与维护的日常工作中&#xff0c;一个常见但易引发误解的话题围绕着整型字段&#xff08;如INT&#xff09;的显示宽度&#xff08;如int(1)、int(10)&#xff09;的实际作用。这一现象不仅在新手中频繁出现&#xff0c;就连经验丰富的开发者也时常陷入误区。最近&a…

2024年【山东省安全员B证】考试报名及山东省安全员B证证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 山东省安全员B证考试报名参考答案及山东省安全员B证考试试题解析是安全生产模拟考试一点通题库老师及山东省安全员B证操作证已考过的学员汇总&#xff0c;相对有效帮助山东省安全员B证证考试学员顺利通过考试。 1、【…

Linux驱动开发—设备树基本概念,语法详解

文章目录 什么是设备树&#xff0c;为什么引入设备树&#xff1f;设备树基本概念相关术语解释设备树源码所在地使用DTC编译设备树基本的DTC编译命令基本的反编译命令效果演示&#xff08;编译与反编译&#xff09; 设备树语法1. 节点 (Node)2. 属性 (Property)3. 包含文件 (Inc…

uniapp svgIcon组件封装

utils/svg/index.ts 存放处理svg的相关方法 // svg 转成url export function svgToUrl(url: any) {var encoded url.replace(/<!--(.*)-->/g, "").replace(/[\r\n]/g, " ").replace(/"/g, ).replace(/%/g, "%25").replace(/&/…

CSDN 僵尸粉 机器人

CSDN 僵尸粉 机器人 1. 前言 不知道什么时候开始每天创作2篇就有1500流量爆光&#xff0c;每次都能收获一些关注和收藏&#xff0c;感觉还是挻开心的感觉CSDN人气还是挻可以的以前各把月一个收藏和关注都没有写的动力了。 2. 正文 后面又连接做了2天的每日创建2篇任务&…

计算机网络408 2017

https://www.zhihu.com/people/suixinyuan1990 【CN】数据链路层.滑动窗口.GBN协议传输过程信道利用率分析_哔哩哔哩_bilibili okokokok 408考研 计算机网络历年真题 分类汇总和解析—【信道利用率】&#xff08;字幕版&#xff09; 408考研 计算机网络历年真题 分类汇总和…

能见度怎么测?应该用什么仪器测呢?

在气象观测、交通安全以及环境监测等多个领域&#xff0c;能见度的准确测量至关重要。那么&#xff0c;能见度究竟是如何测量的呢&#xff1f;答案就是借助先进的能见度测量仪。 能见度测量仪利用光学原理&#xff0c;通过测量空气中微小颗粒&#xff08;如气体分子、气溶胶粒子…

盐城销量比赛 -- YR Tech团队比赛攻略

关联比赛: [印象盐城]数创未来大数据竞赛 - 乘用车零售量预测 查看更多内容&#xff0c;欢迎访问天池技术圈官方地址&#xff1a;盐城销量比赛 -- YR Tech团队比赛攻略_天池技术圈-阿里云天池

关于进程间通信的练习

1> 使用有名管道实现,一个进程用于给另一个进程发消息,另一个进程收到消息后,展示到终端上,并且将消息保存到文件上 一份 create.c #include<myhead.h>int main(int argc, const char *argv[]) {//创建一个管道文件if(mkfifo("./linux",0664)-1){perror(&qu…

account

npx: zhanghee/zhanghe199510 2021年五一/十一&#xff1f;罗征借走5K Amazon Web Services Sign-In 891377395944 tdpal s9DCjRDyMBnV*J!#

一键导出精美电子书,创作无限可能

​你是否想过&#xff0c;将你的创意、故事或知识&#xff0c;通过精美的电子书形式&#xff0c;分享给更多人呢&#xff1f;现在&#xff0c;只需一键&#xff0c;就能轻松实现&#xff01; &#x1f4da;电子书的特点&#xff1a; 1. 便携性&#xff1a;无论身处何地&#x…

电力巡检机器人:助力传统能源发电的创新力量

传统能源发电包括水力、火力、核能发电&#xff0c;这三种主要的发电方式各自具有独特的特点&#xff0c;为我们生活中的各个场景提供了不可或缺的电力支持。然而&#xff0c;由于这些方式的作业环境存在工况封闭狭窄、高电、高磁、高温、有毒气体等情况&#xff0c;导致传统能…