Golang 模块版本管理与语义版本控制详解

目录

语义版本控制(SemVer)

Go 模块版本

模块版本的选择和升级

go.mod 文件

版本管理最佳实践

小结


在 Golang 中,模块(module)是 Go 1.11 版本引入的依赖管理系统,帮助开发者管理项目的依赖。在 Go 模块推出之前,开发者通常使用 GOPATH 和 vendor 目录来管理项目的依赖。但是,这种方法存在一些问题,如依赖管理不严格、版本控制不方便等。Go 模块的出现解决了这些问题,使得依赖管理变得更加简单和高效。

Go 模块的版本管理是基于语义版本控制(Semantic Versioning,简称 SemVer)的。在深入讨论 Go 模块版本之前,需要先理解语义版本控制的基本概念。

语义版本控制(SemVer)

语义版本控制是一个前后向兼容的版本命名系统,遵循 MAJOR.MINOR.PATCH 的格式,其中:

  • MAJOR(主版本号), 版本号在做了不兼容的 API 修改时递增。
  • MINOR (次版本号),版本号在添加了向下兼容的新功能时递增。
  • PATCH (修订号),版本号在做了向下兼容的问题修正时递增。

此外,预发布版本可以通过添加连字符和一系列点分隔的标识符来表示,例如 1.0.0-alpha 或 1.0.0-rc.1。构建元数据可以通过添加加号和一系列点分隔的标识符来表示,例如 1.0.0+20130313144700。

Go 模块版本

在 Golang 中,模块的版本号反映了模块的变更情况。Go 模块系统要求公共的 Go 模块必须遵循语义版本控制规则:

  • 当模块的公共 API 发生变更时,版本号也需要进行相应变更。当这些变更是向后不兼容的,必须增加 MAJOR 版本号。
  • v0 和 v1 版本,v0 版本通常表示开发初期,API 可能会频繁变更,不保证稳定性。v1 版本表示 API 的第一个稳定版本,任何新增的功能都不应该破坏现有的 API。
  • v2 及以上版本模块路径必须在路径的最后加上 /vN,其中 N 是主版本号。例如,如果模块名为 github.com/example/mod,那么 v2 版本或更高版本的模块路径应该是 github.com/example/mod/v2。
  • 预发布版本和构建元数据,预发布版本和构建元数据遵循 SemVer的 规则,但在Go模块中使用较少。预发布版本可以用于在正式发布之前测试模块的新版本。
  • 伪版本,伪版本(pseudo-versions)是 Go 模块用来指代没有明确版本号的模块版本的方法,通常用于依赖特定的提交或者仓库中还没有标记正式版本号的代码。伪版本号的格式通常是 v0.0.0-yyyymmddhhmmss-abcdefabcdef,其中时间戳代表了特定的提交时间,abcdefabcdef 是该次提交的 git commit hash 的前12位。

模块版本的选择和升级

在 Golang 中,当使用 go get 命令安装模块时,会自动选择合适的模块版本:

  • 默认情况下,go get 会选择最新的主版本中的最新的次版本和补丁版本。
  • 使用 go get module@version 可以获取特定版本的模块。
  • 使用 go get -u 可以更新当前模块的依赖到最新的次版本或补丁版本。

go.mod 文件

每个 Go 模块都有一个 go.mod 文件,定义了模块的名称、Go 版本以及依赖项。go.mod 文件中的 require 语句指定了依赖的版本范围,使用 replace 语句可以用来替换依赖项。

版本管理最佳实践

  • 遵循语义版本控制规则。
  • 在发布新版本前,确保 API 的向后兼容性。
  • 对于重大变更,升级 MAJOR 版本号,并更新模块路径。
  • 使用版本标签来标记代码仓库中的版本。
  • 保持 go.mod 文件的整洁,定期运行 go mod tidy。

小结

Go 模块的版本管理既提供了开发的灵活性,又提供了稳定性和可维护性。了解版本的概念、选择合适的版本、进行有效的版本控制,对于使用 Go 模块开发项目至关重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/193406.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python学习路线 - Python语言基础入门 - 学习汇总

Python学习路线 - Python语言基础入门 - 学习汇总 目录准备工作基础语法判断语句功能快捷键功能快捷键功能快捷键功能快捷键功能快捷键功能快捷键功能快捷键功能快捷键 目录 准备工作 基础语法 判断语句 功能快捷键 功能快捷键 功能快捷键 功能快捷键 功能快捷键 功能…

微信小程序:button微信开放能力打开客服会话

文档 https://developers.weixin.qq.com/miniprogram/dev/component/button.html 按钮关键属性 open-type"contact"功能按钮 <button class"button__open-type"open-type"contact"> </button>css样式 父元素需要设置为相对定位…

Linux环境下 make/makefile、文件时间属性 详解!!!

1.项目自动化构建工具make/makefile 1.为什么要有make/makefile 我们先写一个简单的代码&#xff0c;然后编译生成一个可执行程序&#xff0c;下面的内容我们需要知道gcc识和编译链接的一些知识&#xff0c;不清楚的朋友们可以点这里http://t.csdnimg.cn/0QvL8 我们知道要想生…

Java 数据结构篇-用链表、数组实现队列(数组实现:循环队列)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 队列的说明 1.1 队列的几种常用操作 2.0 使用链表实现队列说明 2.1 链表实现队列 2.2 链表实现队列 - 入栈操作 2.3 链表实现队列 - 出栈操作 2.4 链表实现队列 …

9-1定义一个结构体计算该日是本年中的第几天。

#include<stdio.h> struct {int year;int month;int day; }date; int main(){int days;printf("输入年月日&#xff1a;\n");scanf("%d,%d,%d",&date.year,&date.month,&date.day);switch(date.month){case 1:daysdate.day; break;case…

【Element-ui】Checkbox 多选框 与 Input 输入框

文章目录 前言一、Checkbox 多选框1.1 基础用法1.2 禁用状态1.3 多选框组1.4 indeterminate 状态1.5 可选项目数量的限制1.6 按钮样式1.7 带有边框1.8 Checkbox Events1.9 Checkbox Attributes 二、Input 输入框2.1 基础用法2.2 禁用状态2.3 可清空2.4 密码框2.5 带 icon 的输入…

c/c++ header_only 头文件实现的关键点

header_only 头文件实现的关键点 ------------------------------------------------------------------------- author: hjjdebug date: 2023年 11月 28日 星期二 16:58:38 CST descriptor: header_only 头文件实现的关键点1. 对外声明的函数必需加上inline, 消除连接的歧义…

nexus私服开启HTTPS

maven3.8.1以上不允许使用HTTP服务的仓库地址&#xff0c;如果自己搭建的私服需要升级为HTTPS或做一些设置&#xff0c;如果要升级HTTPS服务有两种方式&#xff1a;1、使用Nginx开启HTTPS并反向代理nexus&#xff1b;2、直接在nexus开启HTTPS。这里介绍第二种方式 1、在ssl目录…

在 Qt 的文本编辑类中,document() 是一个成员函数,用于获取文档对象

在 Qt 的文本编辑类中&#xff0c;document() 是一个成员函数&#xff0c;用于获取文档对象。它返回与文本编辑器关联的 QTextDocument 对象的指针。 QTextDocument 类是 Qt 中用于处理富文本内容的类。它包含了文本内容以及相关的格式、样式和布局信息。通过 document() 函数…

关于线程池使用的注意

标题&#xff1a;线程池使用注意事项详解 引言&#xff1a; 线程池是多线程编程中常用的一种技术&#xff0c;它可以有效地管理和复用线程资源&#xff0c;提高程序的性能和效率。然而&#xff0c;在使用线程池时&#xff0c;我们需要注意一些问题&#xff0c;以避免潜在的风险…

计算机网络的分类

目录 一、按照传输介质进行分类 1、有线网络 2、无线网络 二、按照使用者进行分类 1、公用网 (public network) 2、专用网(private network) 三、按照网络规模和作用范围进行分类 1、PAN 个人局域网 2、LAN 局域网 3、MAN 城域网 4、 WAN 广域网 5、Internet 因特…

FWT+高维前缀和:Gym - 103202M

https://vj.imken.moe/contest/597216#problem/F 考虑两个人的集合分别为 i , j i,j i,j&#xff0c;那么我们令 f ( i ⊗ j ) f(i\otimes j) f(i⊗j)&#xff0c;其中 f ( s ) f(s) f(s) 表示两个人不同集合恰好为 s s s&#xff0c;显然 f ( s ) f(s) f(s) 可以FWT求…

ChatGPT 的 18 种玩法,你还不会用吗?

你确定&#xff0c;你会使用 ChatGPT 了吗&#xff1f; 今天给大家整理了 18 种 ChatGPT 的用法&#xff0c;看看有哪些方法是你能得上的。 用之前我们可以打开R5Ai平台&#xff0c;可以免费使用目前所有的大模型 地址&#xff1a;R5Ai.com 语法更正 用途&#xff1a;文章…

Java编程强化练习(二)

表达式计算&#xff08;支持空格&#xff0c;连乘&#xff0c;连除&#xff09;&#xff08;选做题&#xff0c;不计分&#xff09; 【问题描述】 从标准输入中读入一个整数算术运算表达式&#xff0c;如5 - 1 * 2 * 3 12 / 2 / 2 。计算表达式结果&#xff0c;并输出。 …

【vue】尚硅谷vue3学习笔记

Vue3快速上手 1.Vue3简介 2020年9月18日&#xff0c;Vue.js发布3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;海贼王&#xff09;耗时2年多、2600次提交、30个RFC、600次PR、99位贡献者github上的tags地址&#xff1a;https://github.com/vuejs/vue-next/release…

团队可能出现的问题以及应对方案

问题&#xff1a; 1、办公室政治&#xff1a;我的官比你大&#xff0c;你必须听我的&#xff0c;你的想法不重要&#xff0c;这样大家就不敢说话&#xff0c;表面和谐背地里勾心斗角。 2、信息不畅&#xff1a;正常的组织信息是流动的&#xff0c;因为有办公室政治大家就阻止…

使用tensorrt加速深度学习模型推断

使用tensorrt加速深度学习模型推断 1.import以及数据加载、构建engine函数2.导入官方模型及CIFAR100数据集3.不采用tensort的推断时间4.采用tensort加速—使用tensorrt 库4.1 导出onnx模型4.2 生成tensorrt engine 文件4.3 deserialize4.4 推断 5.采用tensort加速—使用torch2t…

mysql(八)docker版Mysql8.x设置大小写忽略

Mysql 5.7设置大小写忽略可以登录到Docker内部&#xff0c;修改/etc/my.cnf添加lower_case_table_names1&#xff0c;并重启docker使之忽略大小写。但MySQL8.0后不允许这样&#xff0c;官方文档记录&#xff1a; lower_case_table_names can only be configured when initializ…

SpringBoot集成knife4j

1&#xff09;添加knife4j的依赖 <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.2</version> </dependency>SpringBoot的版本&#xff1a; <pa…

机器人与3D视觉 Robotics Toolbox Python 一 安装 Robotics Toolbox Python

一 安装python 库 前置条件需要 Python > 3.6&#xff0c;使用pip 安装 pip install roboticstoolbox-python测试安装是否成功 import roboticstoolbox as rtb print(rtb.__version__)输出结果 二 Robotics Toolbox Python样例程序 加载机器人模型 加载由URDF文件定义…