• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Go版本管理--处理不兼容

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

1. 简介

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名字仍保持原样会怎么样呢? 其他项目是否还可以引用呢?其他项目引用时有没有风险呢?这就是今天要讨论的内容。

2.能否引起不兼容的包

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

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Go 实现字符串相似度计算函数 Levenshtein 和 SimilarText发布时间:2022-07-10
下一篇:
go语言学习(一)发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap