总览

  • Go 专家编程 go mod incompatible

在前面的章节中,我们介绍了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名字仍保持原样会怎么样呢? 其他项目是否还可以引用呢?其他项目引用时有没有风险呢?这就是今天要讨论的内容。

go mod 语义版本规范

在Go module时代,module版本号要遵循语义化版本规范,即版本号格式为v<major>.<minor>.<patch>,如v1.2.3。当有不兼容的改变时,需要增加major版本号,如v2.1.0。

Go module规定,如果major版本号大于1,则major版本号需要显式地标记在module名字中,如module github.com/my/mod/v2。这样做的好处是Go module 会把module github.com/my/mod/v2module github.com/my/mod视做两个module,他们甚至可以被同时引用。

imcompatible 的作用是什么?

虽说有了 go mod 语义版本规范,但有人不遵循呀

# 以Module `github.com/RainbowMango/m` 为例,假如其当前版本为`v3.6.0`
require (github.com/RainbowMango/m v3.6.0+incompatible
)
# 而按照go mod 语义版本规范定义,应该新建个 mod ,命名为 github.com/RainbowMango/m/v3
  • 不遵循规范,开发者就无法清除了解【兼容性的变动情况】,可能会给项目的依赖带来风险

1. 能否引用不兼容的包

我们还是以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(不兼容)标识外,在其使用上没有区别。

2. 如何处理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来替代,开源项目如果没有使用者,也就走到了尽头。

【Go mod 学习之 incompatible 篇】对不符合语义版本规范的包进行标记相关推荐

  1. 网络安全学习第10篇 - ping程序的实现,抓包分析ping数据包以及ping工具对于网络安全方面的威胁

    请结合附件:Ping的实现原理与ping.cpp的内容,编写一个程序,使其能够实现简单的ping的功能,即判断目标网站是否可以连接,然后通过Wireshark进行抓包分析其ICMP协议,指出哪个数据包 ...

  2. MySQL学习笔记-基础篇1

    MySQL 学习笔记–基础篇1 目录 MySQL 学习笔记--基础篇1 1. 数据库概述与MySQL安装 1.1 数据库概述 1.1.1 为什么要使用数据库 1.2 数据库与数据库管理系统 1.2.1 ...

  3. R语言学习笔记——入门篇:第一章-R语言介绍

    R语言 R语言学习笔记--入门篇:第一章-R语言介绍 文章目录 R语言 一.R语言简介 1.1.R语言的应用方向 1.2.R语言的特点 二.R软件的安装 2.1.Windows/Mac 2.2.Lin ...

  4. 我的世界java怎么开创造,MOD制作教程JAVA篇

    您尚未登录,立即登录享受更好的浏览体验! 您需要 登录 才可以下载或查看,没有帐号?注册(register) x 本帖最后由 heidada 于 2011-5-12 21:33 编辑 首先我阅读了这个 ...

  5. 【SQL基础学习】----基础篇(1)

    前言: 存储数据的容器 在内存中(数据存在易失性,断电即数据没了):         数组         集合 磁盘(永久存储):         文件(不易管理)         数据库(持久化, ...

  6. html5学习精选5篇案例

    html5学习心得1 一:了解HTML5前端开发技术 HTML 指的是超文本标记语言 (Hyper Text Markup Language),标记语言是一套标记标签 (markup tag),HTM ...

  7. 深度学习——数据预处理篇

    深度学习--数据预处理篇 文章目录 深度学习--数据预处理篇 一.前言 二.常用的数据预处理方法 零均值化(中心化) 数据归一化(normalization) 主成分分析(PCA.Principal ...

  8. [BTS]BizTalk学习之Functoid篇(ID Cross-References)

    早在三周前,就已经收集了所有有关Cross-Reference Functoid的资源,虽然现在看来,它并不是很难,但想真正的应用它,还是需要花费一些心思的研究一下,不过,托了三周时间,还是写完了. ...

  9. RabbitMQ学习总结 第一篇:理论篇

    目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...

最新文章

  1. Even Parity UVA - 11464 (枚举)
  2. 机器学习笔记:线性规划,梯度下降
  3. 趣谈网络协议笔记-二(第十一讲)
  4. ngx_lua应用最佳实践
  5. UART的FIFO功能
  6. 物联网带着诚意扑面而来
  7. 蓝桥杯 参考题目 黄金队列(水题)
  8. react native 第三方组件react-native-swiper 轮播组件
  9. Gradle基础介绍
  10. ccf 推荐会议和期刊
  11. Taro小程序生成二维码保存本地
  12. html ckplayer.swf,Flash基础入门之ckplayer.js视频播放插件
  13. python 天勤 金叉 编程代码_基于tqsdk(天勤)编译的均线交叉与通道突破相结合的交易系统...
  14. 苹果手机几月份最便宜_苹果手机越来越便宜,安卓手机越来越贵,果真是这样吗?...
  15. 电脑计算机c盘打不开怎么办,电脑的c盘炸了打不开电脑了怎么处理
  16. 父爱如山,催泪微电影感动全网
  17. 测试工程师的一点自省感悟
  18. 利用报废主板制作SPD刷内存编程器座子
  19. jvm调优五:jvm调优工具和调优实战
  20. 机器学习——课后习题解答

热门文章

  1. CNIM继续与国际核聚变组织合作,设计和制造用于未来聚变反应堆组件安装的高精度处理设备
  2. 如何通过API接口从淘宝(或天猫店)复制宝贝到拼多多(商品详情,商品销量,商品列表,商品主图,商品sku)接口代码对接教程
  3. GPS定位系统源码,GPSBDpro远程视频监控,实时视频+实时定位
  4. MATLAB-二维图形的绘制
  5. 网页播放器代码大全 超经典版
  6. SQL server 实验练习2
  7. 百分百财富管理软件V1.0
  8. 机器篇——决策树(五) 细说 评估指标的相关曲线(ROC、KS、PR)
  9. 一文了解Python编程语言及安装
  10. NC:南农沈其荣、张瑞福团队揭示多样性激发的确定性细菌装配过程限制群落功能...