前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >​从一个模块冲突问题学习go module

​从一个模块冲突问题学习go module

原创
作者头像
王沛文
修改于 2019-04-23 07:04:50
修改于 2019-04-23 07:04:50
12.2K4
举报
文章被收录于专栏:王沛文的专栏王沛文的专栏

问题

最近遇到了一个很诡异的问题,项目中依赖了ginviper之后竟然提示错误

代码语言:txt
AI代码解释
复制
cannot load github.com/ugorji/go/codec: ambiguous import: found github.com/ugorji/go/codec in multiple modules:
        github.com/ugorji/go v1.1.1 (D:\workspace\go\pkg\mod\github.com\ugorji\go@v1.1.1\codec)
        github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8 (D:\workspace\go\pkg\mod\github.com\ugorji\go\codec@v0.0.0-20181204163529-d75b2dcb6bc8)

直接从字面看似乎是符号冲突,类似于C/C++中引入了两个不同的符号,但是go module以后包都是统一放到$GOPATH/pkg下的不应该会出现类似问题。

通过go mod graph可以查看具体依赖路径

代码语言:txt
AI代码解释
复制
github.com/spf13/viper@v1.3.2 github.com/ugorji/go/codec@v0.0.0-20181204163529-d75b2dcb6bc8
github.com/gin-gonic/gin@v1.3.1-0.20190120102704-f38a3fe65f10 github.com/ugorji/go@v1.1.1

可以看到viper和gin分别依赖了github.com/ugorji/gogithub.com/ugorji/go/codec

应该是go把这两个path当成不同的模块引入导致的冲突

这里很奇怪的地方是,为什么github.com/ugorji/go/codec作为一个子目录也会被当成模块引入

分析

到了github.com/ugorji/go上看发现还真有类似的问题

首先我们看一下这个包是干什么的

根据首页描述应该是个处理msgpack编码协议的包,这里有一点值得注意

github.com/ugorji/go仓库根目录并没有文件,所有实现在github.com/ugorji/go/codec

再回头看看这个包的历史,基本可以了解这个问题了

  1. v1.1.1 这个tag时,并没有使用go.mod,因此当使用了go module的包引用github.com/ugorji/go/codec时,go会根据path找到github.com/ugorji/go这个仓库并将其作为一个包引入

这就对应这上面的

代码语言:txt
AI代码解释
复制
   github.com/ugorji/go v1.1.1
  1. e253f1f20942cb6dc505e504e8bbba4b7f434cb2这个提交之后,作者在codec目录下添加了go.mod文件.这时候go就把github.com/ugorji/go/codec作为一个模块,和前面的github.com/ugorji/go认为是两个模块了.这时如果两个包分别使用了这两个版本就会导致上面的问题
  2. v1.1.2 这个tag时作者修复了上面的问题,方法是在codec目录的go.mod下添加了依赖
代码语言:txt
AI代码解释
复制
+ require github.com/ugorji/go v1.1.2

这时候依赖github.com/ugorji/go@1.1.1的老模块和依赖github.com/ugorji/go/codec@1.1.2的新模块一起使用时,由于上面的变更,整个项目里依赖的github.com/ugorji/go模块会使用较新的1.1.2.

因为1.1.2的时候codec目录下已有go.mod,因此github.com/ugorji/go下面不会有任何文件,就不会导致符号冲突

  1. v1.1.4的时候 作者又把codec下的go.mod删除了,而在根目录下新增了go.mod

这时对go来说回到了v1.1.1的时候,如果同时有两个依赖模块依赖v1.1.2和v1.1.4时同样会出现符号冲突的问题

总结

在gopath时代没有版本的概念,大家都在一个gopath下,符号基于路径,因此没有符号冲突的问题

在vendor时代,vendor下的包会被加上$package\vendor前缀,因此项目中不同的包依赖相同模块的不同版本时也不会冲突

到了module时代,所有的依赖包都在$GOPATH/pkg下,虽然存储的时候分了版本,但是链接时并没有,因此任何代码不同版本只有最新的一份.

可能这些描述看着很别扭,我们先整理一下go module中的一些术语:

  • module 模块。有go.mod文件时,则是go.mod文件所在的路径,对于没有go.mod文件的则是仓库根目录
  • package 包。包就是go文件中import的东西,按路径区分

上面的问题本质就是由于作者的疏忽造成了存在两个模块github.com/ugorji/gogithub.com/ugorji/go/codec同时这两个模块又存在相同的包,导致符号冲突

这些问题在golang官方的wiki中都有描述.建议大家在使用go module之前也详细阅读一下官方wiki

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
4 条评论
热度
最新
非常非常感谢
非常非常感谢
回复回复点赞举报
已经好了
已经好了
回复回复点赞举报
及时雨啊,今天刚遇到
及时雨啊,今天刚遇到
11点赞举报
怎么解决啊,本地怎么配置啊?
怎么解决啊,本地怎么配置啊?
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
Nginx作为静态资源服务器
引用原文:https://docs.nginx.com/nginx/admin-guide/web-server/serving-static-content/#optimizing-performance-for-serving-content
Homqyy
2024/08/23
1820
【Nginx07】Nginx学习:HTTP核心模块(四)错误页面与跳转
最最核心的部分学习完了,但其实还有更多的内容要等待着我们探索。今天我们先来看到的就是关于错误页面的设置以及 301、302 跳转相关的内容。这两块内容都有一个特点,那就是页面或明显地,或不明显地产生了跳转变化,显示的都不是本来我们应该要得到的那个链接的页面。
硬核项目经理
2023/09/07
8230
【Nginx07】Nginx学习:HTTP核心模块(四)错误页面与跳转
Nginx之error_page模块解读
error_page是nginx一个重要的指令,作用是定制化服务器错误页面。当nginx发生内部错误时,比如说404、403、500等错误,默认会跳转到nginx自带的错误页面。但是使用error_page指令可以修改默认错误页面,并且可以指定跳转的url或者文件路径。
一个风轻云淡
2023/09/24
3.5K0
如何完美解决 Nginx出现 404 Not Found nginx/1.23.4 解决方案
在Nginx配置过程中,404 Not Found错误是一个常见问题。本文将详细解析Nginx 404 Not Found的原因及解决方案,确保您能够轻松解决这一问题。通过本篇文章,您将了解Nginx配置的细节,掌握快速定位和修复404错误的方法,提升服务器的稳定性和用户体验。
猫头虎
2024/05/24
8.4K0
Nginx http相关常用配置总结
设置允许的客户端请求体大小最大值,请求头域Content-Length指明的值。如果请求体大小超过配置设置值,返回413错误给客户端。需要注意的是,浏览器不定义可以正确的展示该错误。设置client_max_body_size 为0,禁用请求体大小检查。
授客
2019/09/11
1.5K0
第十一章·Nginx常见问题
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/09/26
7480
第十一章·Nginx常见问题
Nginx设置404错误页面跳转
在server下配置 error_page 以下三种情况都可以起作用, 可以配置在server第一层的任何位置, 不受影响 也可以配置在location里面,我下面代码注释的地方都是可以配置的
拓荒者
2019/08/16
9K0
Nginx 404 错误设置 301 重定向到其它页面的办法
众所周知,404 错误直接影响到我们网站的 SEO,因为这与 SEO 有关。而子凡将分享一个技巧,通过该技巧,你可以通过允许 404 错误页面并且将其 301 重定向到主页或者其它网站页面来提高网站的 SEO 性能。
张子凡
2022/11/02
3.5K0
Nginx 404 错误设置 301 重定向到其它页面的办法
NGINX从入门到精通导航
请参考文章《如何服务器搭建网站(用宝塔面板)》 https://zhuanlan.zhihu.com/p/264988902
辉哥
2021/02/22
9980
NGINX从入门到精通导航
nginx.conf的常用配置类型和方法
Nginx是一个强大的网站服务器,它支持静态网站,本地代理和反向代理等等常用且实用的功能。该服务器包括很多的模块,不同的模块又有相应的指定的指令,ngingx通过读取这些指令进行相应的行为。
EatRice
2020/06/02
2.7K0
nginx.conf的常用配置类型和方法
如何为Nginx设置404页面?
这篇文章发布于2013年,介绍如何为nginx设置一个404页面,当客户端试图访问一个并不存在的资源时,nginx会返回代码为404的错误信息"404 Not Found",这个错误信息非常简陋并且不是很友好,建议根据实际需求设置一个专用的404错误页面(如果没有要求可以使用下面的“腾讯公益宝贝回家”404页面,也许一个微不足道的举动,却已帮助了别人。两全其美哈)。
用户1560186
2019/11/20
6.5K0
如何为Nginx设置404页面?
面试官:vue项目如何部署?有遇到布署服务器后刷新404问题吗?
前后端分离开发模式下,前后端是独立布署的,前端只需要将最后的构建物上传至目标服务器的web容器指定的静态目录下即可
@超人
2021/02/26
8.3K0
面试官:vue项目如何部署?有遇到布署服务器后刷新404问题吗?
Nginx系列教程(7)nginx rewrite配置规则详细说明
注:nginx官方文档:http://nginx.org/en/docs/http/ngx_http_rewrite_module.html
haikangweishi
2020/04/07
7.4K0
Nginx使用经验总结,好记性不比烂笔头(键盘)
每个虚拟主机一个对应的 server 配置项,配置项里面包含该虚拟主机相关的配置。在提供 mail 服务的代理时,也可以建立若干 server,每个 server 通过监听的地址来区分。
房东的狗丶
2023/02/17
1.4K0
五分钟学NGINX-详解nginx的11个请求阶段
Nginx,作为当今最流行的开源Web服务器之一,以其高性能、高稳定性和丰富的功能而闻名。在处理HTTP请求的过程中,Nginx采用了模块化的设计,将整个请求处理流程划分为若干个阶段,每个阶段都可以由特定的模块来处理。这种设计不仅使得Nginx具有极高的灵活性和可扩展性,而且也方便了开发者对Nginx进行定制和优化。我们将深入探讨Nginx处理HTTP请求的11个阶段,揭示其背后的工作原理。
五分钟学SRE
2024/04/22
2.5K0
【Nginx06】Nginx学习:HTTP核心模块(三)Location
Location 是整个 HTTP 模块中非常重要的一个子模块,它是为某个请求URI(路径)建立配置。这个模块又是属于 Server 模块的子模块,同时它还可以嵌套在另一个 Location 模块下面,因此,它的作用范围是 server 和 location 。其实,说白了,也就是我们可以为指定的一些路径去做一些额外的配置。
硬核项目经理
2023/08/09
1K0
【Nginx06】Nginx学习:HTTP核心模块(三)Location
Nginx的https配置记录以及http强制跳转到https的方法梳理
一、Nginx安装(略) 安装的时候需要注意加上 --with-http_ssl_module,因为http_ssl_module不属于Nginx的基本模块。 Nginx安装方法: # ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module # make && make install 二、生成证书(略) 可以使用openssl生成证书
洗尽了浮华
2018/01/23
5.3K0
Nginx---Rewrite
Rewrite是Nginx服务器提供的一个重要基本功能,是Web服务器产品中几乎必备的功能。主要的作用是用来实现URL的重写。
大忽悠爱学习
2021/12/08
1K0
Nginx---Rewrite
常见 HTTP 状态码详解与Nginx 文件上传大小限制
在我们日常使用 Nginx 搭建网站或应用服务时,可能会遇到很多与文件上传和请求响应相关的问题。今天我们就来聊聊 如何限制文件上传的大小,并介绍一些常见的 HTTP 状态码 及其在 Nginx 中的处理方式。
井九
2024/10/12
2910
如何在CentOS操作系统上设置Nginx server指令
server是Nginx指令,用于定义指定域的设置,从而使您可以在一台服务器上运行多个网站。 对于每个网站,您可以设置站点文档根目录(包含网站文件的目录),创建单独的安全策略,使用不同的SSL证书等等。本文介绍了如何在CentOS 8上设置Nginx server指令。
用户5005176
2021/08/11
5610
推荐阅读
相关推荐
Nginx作为静态资源服务器
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档