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
相关文章
|
14天前
|
存储 Go
Golang语言基于go module方式管理包(package)
这篇文章详细介绍了Golang语言中基于go module方式管理包(package)的方法,包括Go Modules的发展历史、go module的介绍、常用命令和操作步骤,并通过代码示例展示了如何初始化项目、引入第三方包、组织代码结构以及运行测试。
18 3
|
22天前
|
数据采集 缓存 IDE
Go中遇到http code 206和302的获取数据的解决方案
文章提供了解决Go语言中处理HTTP状态码206(部分内容)和302(重定向)的方案,包括如何获取部分数据和真实请求地址的方法,以便程序员能快速完成工作,享受七夕时光。
51 0
Go中遇到http code 206和302的获取数据的解决方案
|
1月前
|
编译器 数据库连接 Go
Go Sync 包:并发的 6 个关键概念
Go Sync 包:并发的 6 个关键概念
|
18天前
|
Go 开发者
|
18天前
|
编译器 Go 开发者
|
20天前
|
IDE Go 开发工具
Go Error module declares its path as but was required as解决方案
文章提供了一个解决方案,用于处理在Go工程中将依赖的仓库从A更换为B(即使它们完全相同)时遇到的路径声明错误,建议通过发布新版本来解决此问题。
36 0
|
1月前
|
存储 SQL Go
一文弄懂Go语言的Context包,值得收藏!
在开发高效的Go应用程序时,处理超时、取消操作和传递请求范围的数据至关重要。Go标准库中的`context`包提供了一套强大的工具,用于在不同层级间传递取消信号、超时和截止时间等信息。本文首先概述了`context`包的核心功能,接着详细介绍了关键方法,如`WithCancel`、`WithDeadline`、`WithTimeout`和`WithValue`的使用场景。通过创建和派生上下文,开发者能更好地管理请求的生命周期,控制长时间运行的操作,并在并发环境中传递必要的数据。
33 1
|
2月前
|
存储 Go
go语言中fmt格式化包和内置函数汇总
【7月更文挑战第10天】本文介绍fmt包和`Errorf`用于创建格式化的错误消息。`fmt`包还涉及一些接口,如`Formatter`、`GoStringer`、`ScanState`、`Scanner`和`Stringer`,支持自定义格式化和输入/输出处理。
39 1
|
2月前
|
Go
Go 项目自动重载解决方案 —— Air 使用入门
**Air**: 提升Go开发效率的利器!自动重载工具,监听文件变化,实时编译运行,无需频繁重启。安装:启用Go Module后,运行`GO111MODULE=on go install github.com/cosmtrek/air@latest`。启动项目:`air`,配置文件默认为`air.toml`。集成到项目,忽略`tmp/`目录。让代码更改即时生效,专注编码,告别手动重启。适用于开发环境,生产环境禁用。[更多详情](https://github.com/cosmtrek/air)
54 1
|
8天前
|
程序员 Go PHP
为什么大部分的 PHP 程序员转不了 Go 语言?
【9月更文挑战第8天】大部分 PHP 程序员难以转向 Go 语言,主要因为:一、编程习惯与思维方式差异,如语法风格和编程范式;二、学习成本高,需掌握新知识体系且面临项目压力;三、职业发展考量,现有技能价值及市场需求不确定性。学习新语言虽有挑战,但对拓宽职业道路至关重要。
38 10