Go引用包版本更新但是被引用的包的子包并没有出现在vendor中的问题和解决方案

简介: 文章讨论了在Go模块项目中升级依赖包版本时遇到的子包未出现在vendor目录的问题,并提供了直接删除旧版本引用并重新执行`go mod vendor`的解决方案。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

问题现象

1. A服务引用B包的版本 v0.1.1

2.B包进行升级添加了子包httpclient和工具文件env.go,并发布了版本v0.1.2

3.在A服务的go.mod模块将B的引用升级到v0.1.2

4.在A服务依次执行go mod tidy; go mod vendor继续升级,没有错误,提示成功。

5. 进入到vendor的对应目录进行检查,确实出现了工具文件env.go,证明确实引用升级到了最新的版本;但是并没有子包httpclient。

问题原因

目前,我也没找到确切的原因,暂时考虑是缓存的问题。

解决方案

当然,没找到原因,并没意味着问题就不能解决,毕竟解决问题才是王道。解决方案如下:

1. 直接在go.mod中删掉原来版本的引用,而不是进行版本的更新

    gitlab.*****.me/****/****-lib v0.1.4

2.紧接着执行go mod vendor。这一步的目的是清除掉vendor中老版本的****-lib的包。

但是,如果在Goand进行执行的话,go.mod会自动检测到代码对****-lib的引用,所以执行go mod vendor就会进行删除旧的并引用新的,执行输出如下:

➜  *** git:(master) ✗ go mod vendor
go: finding module for package gitlab.***.me/***/***-lib/sign
go: finding module for package gitlab.***.me/***/***-lib/common
go: finding module for package gitlab.***.me/***/***-lib/httpclient
Enter passphrase for key '/Users/****/.ssh/id_rsa': 
go: found gitlab.***.me/***/***-lib/common in 
gitlab.***.me/***/***-lib v0.1.4
go: found gitlab.***.me/***/***-lib/httpclient in 
gitlab.***.me/***/***-lib v0.1.4
go: found gitlab.***.me/***/***-lib/sign in 
gitlab.***.me/***/***-lib v0.1.4
相关文章
|
2月前
|
测试技术 Go API
Go 切片导致 rand.Shuffle 产生重复数据的原因与解决方案
在 Go 语言开发中,使用切片时由于其底层数据共享特性,可能会引发意想不到的 Bug。本文分析了 `rand.Shuffle` 后切片数据重复的问题,指出原因在于切片是引用类型,直接赋值会导致底层数组共享,进而影响原始数据。解决方案是使用 `append` 进行数据拷贝,确保独立副本,避免 `rand.Shuffle` 影响原始数据。总结强调了切片作为引用类型的特性及正确处理方法,确保代码稳定性和正确性。
133 82
|
29天前
|
Go 开发者
go-carbon v2.6.0 重大版本更新,轻量级、语义化、对开发者友好的 golang 时间处理库
carbon 是一个轻量级、语义化、对开发者友好的 Golang 时间处理库,提供了对时间穿越、时间差值、时间极值、时间判断、星座、星座、农历、儒略日 / 简化儒略日、波斯历 / 伊朗历的支持
63 3
|
3月前
|
Go 数据库
Go语言中的包(package)是如何组织的?
在Go语言中,包是代码组织和管理的基本单元,用于集合相关函数、类型和变量,便于复用和维护。包通过目录结构、文件命名、初始化函数(`init`)及导出规则来管理命名空间和依赖关系。合理的包组织能提高代码的可读性、可维护性和可复用性,减少耦合度。例如,`stringutils`包提供字符串处理函数,主程序导入使用这些函数,使代码结构清晰易懂。
199 11
|
4月前
|
Linux Go iOS开发
怎么禁用 vscode 中点击 go 包名时自动打开浏览器跳转到 pkg.go.dev
本文介绍了如何在 VSCode 中禁用点击 Go 包名时自动打开浏览器跳转到 pkg.go.dev 的功能。通过将 gopls 的 `ui.navigation.importShortcut` 设置为 "Definition",可以实现仅跳转到定义处而不打开链接。具体操作步骤包括:打开设置、搜索 gopls、编辑 settings.json 文件并保存更改,最后重启 VSCode 使设置生效。
152 7
怎么禁用 vscode 中点击 go 包名时自动打开浏览器跳转到 pkg.go.dev
|
5月前
|
Go 索引
go语言使用strings包
go语言使用strings包
110 3
|
5月前
|
编译器 Go 开发者
go语言中导入相关包
【11月更文挑战第1天】
73 3
|
6月前
|
存储 Go 数据库
Go语言Context包源码学习
【10月更文挑战第21天】Go 语言中的 `context` 包用于在函数调用链中传递请求上下文信息,支持请求的取消、超时和截止时间管理。其核心接口 `Context` 定义了 `Deadline`、`Done`、`Err` 和 `Value` 方法,分别用于处理截止时间、取消信号、错误信息和键值对数据。包内提供了 `emptyCtx`、`cancelCtx`、`timerCtx` 和 `valueCtx` 四种实现类型,满足不同场景需求。示例代码展示了如何使用带有超时功能的上下文进行任务管理和取消。
|
6月前
|
存储 缓存 算法
go vendor module
go vendor module
|
7月前
|
存储 Go
Golang语言基于go module方式管理包(package)
这篇文章详细介绍了Golang语言中基于go module方式管理包(package)的方法,包括Go Modules的发展历史、go module的介绍、常用命令和操作步骤,并通过代码示例展示了如何初始化项目、引入第三方包、组织代码结构以及运行测试。
210 3
|
8月前
|
Go 开发者
什么是 Golang 包?详解 Go 语言的包系统
【8月更文挑战第31天】
136 0

热门文章

最新文章