文档章节

【Go 专家编程】go.mod 文件中incompatible包意味着什么

恋恋美食
 恋恋美食
发布于 02/17 00:29
字数 845
阅读 1K
收藏 0

在前面的章节中,我们介绍了Go module的版本选择机制,其中介绍了一个Module的版本号需要遵循v<major>.<minor>.<patch>的格式,此外,如果major版本号大于1时,其版本号还需要体现在Module名字中。

比如Module github.com/RainbowMango/m,如果其版本号增长到v2.x.x时,其Module名字也需要相应的改变为: github.com/RainbowMango/m/v2。即,如果major版本号大于1时,需要在Module名字中体现版本。

那么如果Module的major版本号虽然变成了v2.x.x,但Module名字仍保持原样会怎么样呢? 其他项目是否还可以引用呢?其他项目引用时有没有风险呢?这就是今天要讨论的内容。

能否引用不兼容的包

我们还是以Module github.com/RainbowMango/m 为例,假如其当前版本为v3.6.0,因为其Module名字未遵循Golang所推荐的风格,即Module名中附带版本信息,我们称这个Module为不规范的Module。

不规范的Module还是可以引用的,但跟引用规范的Module略有差别。

如果我们在项目A中引用了该module,使用命令go mod tidy,go 命令会自动查找Module m的最新版本,即v3.6.0。 由于Module为不规范的Module,为了加以区分,go 命令会在go.mod中增加+incompatible 标识。

require (
	github.com/RainbowMango/m v3.6.0+incompatible
)

除了增加+incompatible(不兼容)标识外,在其使用上没有区别。

如何处理incompatible

go.mod文件中出现+incompatible,说明你引用了一个不规范的Module,正常情况下,只能说明这个Module版本未遵循版本化语义规范。但引用这个规范的Module还是有些困扰,可能还会有一定的风险。

比如,我们拿某开源Module github.com/blang/semver为例,编写本文时,该Module最新版本为v3.6.0,但其go.mod中记录的Module却是:

module github.com/blang/semver

Module github.com/blang/semver 在另一个著名的开源软件Kubernetes(github.com/kubernetes/kubernetes)中被引用,那么Kubernetesgo.mod文件则会标记这个Module为+incompatible

require (
	...
	github.com/blang/semver v3.5.0+incompatible
	...
)

站在Kubernetes的角度,此处的困扰在于,如果将来 github.com/blang/semver发布了新版本v4.0.0,但不幸的是Module名字仍然为github.com/blang/semver。那么,升级这个Module的版本将会变得困难。因为v3.6.0v4.0.0跨越了大版本,按照语义化版本规范来解释说明发生了不兼容的改变,即然不兼容,项目维护者有必须对升级持谨慎态度,甚至放弃升级。

站在github.com/blang/semver的角度,如果迟迟不能将自身变得"规范",那么其他项目有可能放弃本Module,转而使用其他更规范的Module来替代,开源项目如果没有使用者,也就走到了尽头。

赠人玫瑰手留余香,如果觉得不错请给个赞~

本篇文章已归档到GitHub项目,求星~ 点我即达

© 著作权归作者所有

恋恋美食

恋恋美食

粉丝 123
博文 210
码字总数 206751
作品 0
杭州
高级程序员
私信 提问
加载中

评论(0)

Go module 如何发布 v2 及以上版本?

文章目录 Go module 版本号 Go 项目如何升级 v2? incompatible v0.0.0-20190312205133-abcdefghijklm tag 删除了重建为什么没效果? 用上 go mod 之后,依赖包都是通过版本打 tag 的形式确定...

John
2019/09/16
0
0
golang内置包管理工具go mod简明教程

go mod go buildin package manager. go mod是go语言内置的包管理工具,集成在go tool中,安装好go就可以使用。 要求: go version >= 1.11 官方文档: https://tip.golang.org/cmd/go... 环境...

wind5o
2019/09/29
0
0
Golang 编写依赖包后使用报错, 以及无法即使更新最新版本依赖

依赖包报错 module declares its path as: but was required as: 今天将一部分共用的代码提取出来, 放在 github 以单独项目进行管理. 从另一个库进行依赖的时候, 执行 加载依赖, 报错如上. 看...

jiftle
03/30
0
0
golang 依赖管理之 mod

go 很早就考虑了依赖管理的问题,内置 go get 命令,可以直接获取对应的依赖,非常方便,但是有一个巨大的缺陷,没有版本的维护和管理,而版本不一致可能会导致各种兼容性问题,因此出现了很...

xjtuhit
02/11
0
0
Golang modules 初探

今天天色刚刚亮起,起床看到golang 1.11正式发版了,有着两个重要的特性:modules和WebAssembly。 本博文只要说的是modules,从Java转golang的同学肯定是对golang的包管理充满了无奈之情,我...

梦朝思夕
2018/08/26
1.3W
13

没有更多内容

加载失败,请刷新页面

加载更多

使 egg-multipart 同时支持 stream 和 file

项目中,上传图片是通过 stream,上传excel是通过file 接受的 config.multipart = { // fileSize: '50mb', // 文件大小 fileModeMatch: /^(\/tools\/excel\/import)$/, // '/tools/exce......

osc_z9t307rr
16分钟前
16
0
python 日志模块

之前项目中用的是工具组做的日志模块,用的久了,脑袋里就懒得思考这是如何实现的。毕竟菊厂的开发,忙成狗,不是我所负责的自然只是看看会用就行了。最近开始奋发图强,自然要好好看下基础的...

osc_w4g8kpwc
17分钟前
28
0
java方法、方法重载

java方法 一、Java方法 1. 方法声明 [修饰符1 修饰符2 ...] 返回值类型 方法名(形式参数列表) { 语句... } 2. 方法调用 对象名.方法名(实际参数); 1 public class TestMethod { 2 ...

osc_oq0m8kxk
19分钟前
27
0
python基础入门之十八 —— 模块和包

一、模块 模块能定义函数,类和变量,模块里也能包含可执行代码。 1、 导入模块 import 模块名 from 模块名 import 功能名 from 模块名 import * # 法1:import 模块import mathprint(math...

osc_sejhgcp0
21分钟前
28
0
面试刷题31:分布式ID设计方案

面试中关于分布式的问题很多。(分布式事务,基本理论CAP,BASE,分布式锁)先来一个简单的。 简单说一下分布式ID的设计方案? 首先要明确在分布式环境下,分布式id的基本要求。 1, 全局唯一,...

osc_yva3gh56
21分钟前
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部