Go版本管理--处理不兼容
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)
中被引用,那么Kubernetes
的go.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.0
到v4.0.0
跨越了大版本,按照语义化版本规范来解释说明发生了不兼容的改变,即然不兼容,项目维护者有必须对升级持谨慎态度,甚至放弃升级。
站在github.com/blang/semver
的角度,如果迟迟不能将自身变得”规范”,那么其他项目有可能放弃本Module,转而使用其他更规范的Module来替代,开源项目如果没有使用者,也就走到了尽头。
Go版本管理--处理不兼容的更多相关文章
- Atitit Atitit.软件兼容性原理----------API兼容 Qa7
Atitit Atitit.软件兼容性原理----------API兼容 Qa7 1. 兼容性的重要性与反面教材1 2. 提升兼容性的原则2 2.1. What 与how 分离2 2.2. 老人老办法 ...
- PHP 开发的 API 多版本管理实践
遇到的情况 本文针对移动互联网客户端需要兼容旧版的情况,强制升级到最新版本的 app 不在讨论之列. 在 bugtags.com 项目中,我们的版本遵循下面规范.1.0.1大功能.小更新.bug 修正 ...
- 让SpringMVC支持可版本管理的Restful接口
需求 移动互联网时代的到来,软件开发的模式也在变化.记得以前做B/S的后台开发,基本上没有Http接口一说,全部是通过渲染模板技术(jsp,freemark)把最终html展示给最终用户.现在完全变了 ...
- restful架构风格设计准则(六)版本管理
读书笔记,原文链接:http://www.cnblogs.com/loveis715/p/4669091.html,感谢作者! 版本管理 在前面已经提到过,一个REST系统为资源所抽象出的URI实际上 ...
- 你应该学会的Python多版本管理工具Pyenv
目录 Pyenv 简介 安装pyenv 通过pyenv安装python各种发行版 pyenv命令 多版本Python的管理 Pyenv常见问题Wiki Pyenv 简介 首先,该工具是在类linux环 ...
- npm常用命令学习(npm install -D,semver版本规范, npm进行版本管理的最佳实践用法)
什么是npm npm有两层含义.一层含义是Node的开放式模块登记和管理系统,网址为npmjs.org.另一层含义是Node默认的模块管理器,是一个命令行下的软件,用来安装和管理Node模块. npm ...
- Node版本管理工具-NVM的安装与使用(windows系统)
友情提示:为避免踩坑,建议浏览全文后动手操作!!! 一.nvm是什么 看到这篇文章的猿/媛们肯定不会问这个问题了,但是我还是要说,哈哈哈! 无论工作还是干嘛,就不会一直做项目,所以肯定也不会一直用一个 ...
- 在Ubuntu 18.04中安装pyenv(Python多版本管理工具)
最近正在重头梳理Python的基础知识,为了更好地使用Python进行开发,防止发生版本混乱(不同的第三方库有可能因为Python版本不兼容而报错),所以需要使用pyenv进行版本管理. *** 通常 ...
- Python多版本管理器-pyenv 介绍及部署记录
一. pyenv简单介绍 在日常运维中, 经常遇到这样的情况: 系统自带的Python是2.x,而业务部署需要Python 3.x 环境, 此时需要在系统中安装多个Python版本,但又不能影响系统自 ...
随机推荐
- Qt 入门 ---- 如何在程序窗口显示图片?
步骤: 1. 选择资源(准备图片) 2. 加载资源(导入图片) 3. 使用资源(显示图片) 具体操作流程: ① 从网上寻找合适的图片素材,下载到本地,在项目根目录下创建一个images文件夹存储程序中 ...
- vue+element实现分页--之--前端分页
效果图: 访问的数据量小,一次返回所有数据,再次利用elementUI-Table 和el-pagination组件进行展示,关键点事数据的筛选 官网的完整案例 <div class=" ...
- java垃圾回收机制学习总结
最近学习了一下java垃圾回收机制,将其主要内容大致总结一下: 1.什么是垃圾回收机制 java GC机制(garbage collection,垃圾收集,垃圾回收),是java特有的机制,作为jav ...
- Android 开发必备的知识点——JVM基础【转】
image 1.JVM与操作系统的关系 Java Virtual Machine JVM 全称 Java Virtual Machine,也就是我们耳熟能详的 Java 虚拟机.它能识别 .class ...
- Elsevier(爱思唯尔)期刊模板的使用
1.爱思唯尔(Elsevier)期刊模板的使用 2.sci论文(以Elsevier为例) latex文件从小白到投稿 3.初次使用爱斯维尔(Elsevier)论文模板遇到的坑 4.latex学习 da ...
- anyRTC Web SDK 实现音视频呼叫功能
前言 大家好,今天小编带给大家一个基于 anyRTC Web SDK 实现音视频呼叫的功能(本项目采用vue开发). 前提条件 在开始写代码之前还需要做一些准备工作,如果你之前没有使用过 anyRTC ...
- 什么是软件的CLI安装
Websoft9 在进行开源软件的集成与自动化安装研究过程中发现有些软件有CLI安装模式,例如Gitlab CLI版本.Ghost CLI.PHP CLI等,CLI安装是什么意思? CLI(Comma ...
- 在nodejs中利用 Proxy监听对象值的获取
1 window = new Proxy(global, { 2 get: function (target, key, receiver) { 3 console.log("window. ...
- WinForm PerformClick()
在Winfrom开发中,经常遇到调用Click事件,如:btn_click(null,null),其实winfrom也自带一个模拟点击事件:PerformClick(),区别就是:前者无论控件是否En ...
- DVWA靶场练习-Command Injection命令注入
Command Injection 原理 攻击者通过构造恶意参数,破坏命令的语句结构,从而达到执行恶意命令的目的.