执行go vendor第三方包版本冲突问题解决

 更新时间:2022年07月15日 14:44:04   作者:Airy  
这篇文章主要为大家介绍了执行go vendor时,第三方包go版本冲突问题的解决方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

问题症状

我们使用 jenkins 脚本执行 go build ,用来构建线上服务器使用的二进制文件。构建过程中有这样一个步骤:

go mod vendor

该步骤将以 go.mod 文件中写明的包和版本为准下载第三方依赖并保存到本地的 vendor 目录。下载过程中将校验 go.sum 中的 hash 值是否同文件 hash 一致。

在实际执行中,遇到这样的错误:

internal error: failed to find embedded files of github.com/marten-seemann/qtls-go1-18: //go:build comment without // +build comment

排查经过

通过 qtls-go1-18 的仓库名可以观察到问题可能跟 go 1.18 的版本有关。

打开依赖的 github 仓库可见简介:

Go standard library TLS 1.3 implementation, modified for QUIC. For Go 1.18.

而我们构建的环境 go env 输出的版本为 1.16

在 go 1.18 的 release notes 中查找相关信息:

//go:build lines
Go 1.17 introduced //go:build lines as a more readable way to write build constraints, instead of // +build lines. As of Go 1.17, gofmt adds //go:build lines to match existing +build lines and keeps them in sync, while go vet diagnoses when they are out of sync.

Since the release of Go 1.18 marks the end of support for Go 1.16, all supported versions of Go now understand //go:build lines. In Go 1.18, go fix now removes the now-obsolete // +build lines in modules declaring go 1.18 or later in their go.mod files.

报错的意思是 //go:build (1.18 版本支持) 必须同 // +build 一起出现。至此确认问题原因。

解决办法

业务代码并没有直接用到 qtls 包,且并没有直接依赖 qtls-go1-18 对应的 go 版本。此库为非直接依赖引入的,需要找出是那个包引入了这个依赖。

go mod why github.com/marten-seemann/qtls-go1-18

可以查看是谁引入该依赖。从输出可以看到:

# github.com/marten-seemann/qtls-go1-18
git.mycompany.com/group/projecta
git.mycompany.com/group/projectb
github.com/smallnest/rpcx/client
github.com/lucas-clemente/quic-go
github.com/marten-seemann/qtls-go1-18

通过 go mod graph 可以看到具体那个包的那个版本引入的

最终确认是 quic-go 的 0.27 引入的。

在 go.mod 中排除掉 quic-go 0.27 即可。在 go.mod 中加一行。

exclude lucas-clemente/quic-go v0.27.0

总结和其他

  • 为什么 go mod vendor 会更新版本,理论上只会使用 go.mod 中制定的版本;
  • build 机器不需要 go mod vendor ,直接 go mod download 即可;
  • go mod vendor 同 go mod download 在依赖管理上有什么不同?

以上就是执行go vendor第三方包版本冲突问题解决的详细内容,更多关于go vendor版本冲突的资料请关注脚本之家其它相关文章!

相关文章

  • Golang结构化日志包log/slog的使用详解

    Golang结构化日志包log/slog的使用详解

    官方提供的用于打印日志的包是标准库中的 log 包,该包虽然被广泛使用,但是缺点也很多,所以Go 1.21新增的 log/slog 完美解决了以上问题,下面我们就来看看log/slog包的使用吧
    2023-09-09
  • gin 获取post请求的json body操作

    gin 获取post请求的json body操作

    这篇文章主要介绍了gin 获取post请求的json body操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • go micro微服务框架项目搭建方法

    go micro微服务框架项目搭建方法

    这篇文章主要为大家介绍了go micro微服务框架项目搭建方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • go run main.go 一直提示找不到包的解决方案

    go run main.go 一直提示找不到包的解决方案

    这篇文章主要介绍了go run main.go 一直提示找不到包的解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • 解决Golang json序列化字符串时多了\的情况

    解决Golang json序列化字符串时多了\的情况

    这篇文章主要介绍了解决Golang json序列化字符串时多了\的情况,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Go语言学习之将mp4通过rtmp推送流媒体服务的实现方法

    Go语言学习之将mp4通过rtmp推送流媒体服务的实现方法

    对音视频一直是小白,决定沉下心来,好好研究一下音视频知识,下面这篇文章主要给大家介绍了关于Go语言学习之将mp4通过rtmp推送流媒体服务的实现方法,需要的朋友可以参考下
    2022-12-12
  • golang jwt+token验证的实现

    golang jwt+token验证的实现

    这篇文章主要介绍了golang jwt+token验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Go语言应用闭包之返回函数

    Go语言应用闭包之返回函数

    这篇文章主要介绍了Go语言应用闭包之返回函数,对于非常底层的纯 Go 语言代码或者包而言,在各个操作系统平台上的可移植性是非常强的,只需要将源码拷贝到相应平台上进行编译即可,或者可以使用交叉编译来构建目标平台的应用程序,需要的朋友可以参考下
    2023-07-07
  • Go 语言进阶单元测试示例详解

    Go 语言进阶单元测试示例详解

    这篇文章主要为大家介绍了Go 语言进阶单元测试示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • Golang 实现Socket服务端和客户端使用TCP协议通讯

    Golang 实现Socket服务端和客户端使用TCP协议通讯

    这篇文章主要介绍了Golang 实现Socket服务端和客户端使用TCP协议通讯,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12

最新评论