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

目录
  • 问题症状
    • 排查经过
  • 解决办法
  • 总结和其他

问题症状

我们使用 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版本冲突的资料请关注我们其它相关文章!

(0)

相关推荐

  • golang开发go包依赖管理godep使用教程

    目录 介绍 安装 包管理使用 godep 拉取依赖 restore 用于开发 检出依赖 save godep 编译运行 build Godeps目录的作用 godep其他命令 介绍 godep是解决包依赖的管理工具,目前最主流的一种,原理是扫描记录版本控制的信息,并在go命令前加壳来做到依赖管理 godep 建议在 golang 1.6 以后使用 godep 依赖 vendor 具体查看 https://stackoverflow.com/questions/37237036/how-shoul

  • Go外部依赖包从vendor,$GOPATH和$GOPATH/pkg/mod查找顺序

    vendor vendor概念最早是由Keith提出,用来存放依赖包.在版本1.5出现.例如gb项目提供了一个名为gsftp的示例项目,它有一个gsftp程序,在标准库之外有三个依赖项.golang.org/x/crypto/ssh, golang.org/x/crypto/ssh/agent和github.com/pkg/sftp. 按vendor概念调整的目录结构如下: $GOPATH | src/ | | github.com/constabulary/example-gsftp/ | |

  • 解决go build不去vendor下查找包的问题

    go build 报错: main.go:5:2: cannot find package "gopkg.in/go-playground/validator.v9" in any of: /usr/local/go/src/gopkg.in/go-playground/validator.v9 (from $GOROOT) /root/work/testjdcloud/src/gopkg.in/go-playground/validator.v9 (from $GOPATH) 但是为

  • 详解Go语言中关于包导入必学的 8 个知识点

    1. 单行导入与多行导入 在 Go 语言中,一个包可包含多个 .go 文件(这些文件必须得在同一级文件夹中),只要这些 .go 文件的头部都使用 package 关键字声明了同一个包. 导入包主要可分为两种方式: 单行导入 import "fmt" import "sync" 多行导入 import( "fmt" "sync" ) 如你所见,Go 语言中 导入的包,必须得用双引号包含,在这里吐槽一下. 2. 使用别名 在一些场

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

    目录 问题症状 排查经过 解决办法 总结和其他 问题症状 我们使用 jenkins 脚本执行 go build ,用来构建线上服务器使用的二进制文件.构建过程中有这样一个步骤: go mod vendor 该步骤将以 go.mod 文件中写明的包和版本为准下载第三方依赖并保存到本地的 vendor 目录.下载过程中将校验 go.sum 中的 hash 值是否同文件 hash 一致. 在实际执行中,遇到这样的错误: internal error: failed to find embedded f

  • Springboot2.6.x高版本与Swagger2版本冲突问题解决方法

    目录 问题: 原因 完整解决方案: 问题: Spring Boot 2.6.x版本引入依赖 springfox-boot-starter (Swagger 3.0) 后,启动容器会报错: Failed to start bean ‘ documentationPluginsBootstrapper ‘ ; nested exception… 原因 Springfox 假设 Spring MVC 的路径匹配策略是 ant-path-matcher,而 Spring Boot 2.6.x版本的默认匹

  • python中安装模块包版本冲突问题的解决

    问题 最近在工作中遇到一个问题,在安装python软件包的时候,经常会遇类似这样一个问题.比如对于ipython,机子本身安装的版本是1.2.1,显然太低,不足以跑jupyter,尝试着用pip安装,却发现下载的过程一路畅通,但是安装的时候却总是会报这样一个错误. 错误提示如下: ......'Not uninstalling ipython at /usr/lib/python2.7/dist-packages, owned by OS'...... 最终显示了ipython已经成功安装,但是

  • 使用python搭建Django应用程序步骤及版本冲突问题解决

    首先你要确保你机器上面安装了python,其次,你还要确保你上面安装了Django.接下来,才能进入到搭建第一个Django应用程序很简单的操作,即在windows终端输入代码: 复制代码 代码如下: 1 django-admin.py startproject mysite 即可,如:我是在我电脑的   E:\Python33\python_workspace 目录下面创建项目的目录是你自己定的运行命令: 复制代码 代码如下: django-admin.py startproject mysi

  • com.android.support版本冲突解决方法

    项目中不同Module的support包版本冲突怎么办? 只需要将以下代码复制到每个模块的build.gradle(Module:xxx)文件的根目录即可: // 统一当前Module的所有support包版本 configurations.all { resolutionStrategy.eachDependency { DependencyResolveDetails details -> def requested = details.requested if (requested.gro

  • Laravel第三方包报class not found的解决方法

    出现的问题 公司开发使用PHP,技术框架使用Laravel.最近线上出现一个问题,就是上线之后,每次都会出错.查看出错原因,是composer安装的第三方出现class not found.因为这个问题,在线下使用Lumen框架的时候,遇到过,查找问题原因是因为依赖的composer包中composer.json中的"autoload":{"psr-4":{}}书写格式问题.解决方法使用命令:composer dump-autoload -o; 虽然知道问题的所在,

  • Windows下anaconda安装第三方包的方法小结(tensorflow、gensim为例)

    anaconda 集成了很多科学计算中所需要的包,如numpy,scipy等等,具体查看anaconda中已经预先安装配置好的包有哪些,可以通过cmd命令,输入conda list 查看,如下图所示: 但是,因为实际需求,我们会需要导入列表中没有的第三方包,如gemsim,在anaconda中,我们可以参考以下步骤安装所需要的第三方包:         1.启动anaconda 命令窗口: 开始 > 所有程序 > anaconda >anaconda prompt    2.安装gens

  • angular第三方包开发整理(小结)

    近日笔者维护自己的几个无名小repo时,发觉想要创作一个第三方angular包,着实有一些不难但易乱的小问题,故作此文总结.本文将完成以下内容: 从空白开始搭建一个基于angular的第三方包 在本地测试待发布的包 在npm或yarn发布包中指定内容 在普通angular应用中引入并使用发布的包 基本项目搭建 一般的angular app使用angular-cli创建,直接ng new name搞定,生成的项目把webpack.AOT.dev server等细节都隐藏了,还支持各种参数来配置测试

  • Python之虚拟环境virtualenv,pipreqs生成项目依赖第三方包的方法

    virtualenv简介 含义: virtual:虚拟,env:environment环境的简写,所以virtualenv就是虚拟环境,顾名思义,就是虚拟出来的一个新环境,比如我们使用的虚拟机.docker,它们都是把一部分的内容独立出来,这部分独立的内容相当于一个容器,在这个容器只呢个,我们可以"为所欲为"----安装需要的依赖包,软件..,同时这个容器是与外界相互独立的,容器与容器直接也是互相独立不影响. 为何要用虚拟环境: [前提概要] Django也是一个非常流行的web框架.

  • Ubuntu18.04 一键升级Python所有第三方包 及安装python包的方法

    一.pip是什么 pip 是 Python 包管理工具,该工具提供了对Python 包的查找.下载.安装.卸载的功能. 二.升级pip版本 1.默认Ubuntu自带的pip (pip 9.0.1)是基于Python2.7的版本 2.我们需要重新安装基于Python3的pip: sudo apt-get install python3-pip 3.升级pip3版本: python3 -m pip install --upgrade pip 4.查看Python3的pip版本,如果报以下错误: Im

随机推荐