当前位置: 首页 > Web前端 > HTML

Go模块基础提炼,六大核心概念全面剖析(下)

时间:2023-03-28 14:06:02 HTML

点击订阅《云荐大咖》专栏,获取官方推荐优质内容,学技术不迷路!Go语言开发时,路径是怎么定义的?GoMudules为此带来了哪些改变?本文将全面介绍Gomodules的六大核心概念,包括设计理念和兼容性原则等,掌握这些技术要点对于管理和维护Gomodules有很大的价值。在上一篇文章中,笔者以经典的helloworld为例,介绍了如何创建一个Gomodule。需要注意的是,一个模块可以包含多个包,它们可以被发布、打包、版本控制。同时也可以通过版本管理系统(github、gitlab)或者goproxy代理下载GoModules。在使用GoModules之前,建议大家弄清楚其中密切相关的六个核心概念,以方便后期开发使用过程中的理解。我们在使用Go语言进行开发时,经常会遇到“example.com/test”或者“example.com/test/pkg/log”这样的路径。这些路径是如何定义的,它们之间的关系是什么?,它在GoModules中扮演什么角色?GoModules的引入给现有包引入了哪些新概念,它们又是如何协同工作的?对兼容性提出了哪些新要求?一起来看看吧。一:模块路径(ModulePath)Go使用“模块路径”来区分不同的模块模块,定义在go.mod文件中,其中还包含了编译该模块所需的其他依赖。如果一个目录包含一个go.mod文件,那么这个目录就是Go模块的根目录。此外,我们还会介绍包(package)的概念,它在GoModules出现之前就已经存在了。Go模块中的“包”是同一目录中将一起编译的源代码文件的集合。“包路径”是模块路径和子目录(相对于模块根目录的路径)的组合。比如在模块“golang.org/x/net”下的html目录下有一个包,这个包的路径是“golang.org/x/net/html”。总结一下:一个代码仓库可以包含多个Go模块,一个Go模块可以包含多个Go包。模块路径是Go模块的规范名称,用于区分不同的模块。同时也是本模块下Go包的路径前缀。理论上,模块路径至少应该包含两条关键信息:模块的功能,从哪里获取模块2:版本号和兼容原则版本号相当于一个模块的只读快照,可以是正式发布版本或预发布版本。每个版本都以字母v开头,后跟语义版本,例如v1.0.0。总而言之,语义版本由三个由点分隔的非负整数组成(主要版本、次要版本和补丁版本,从左到右)。补丁版本后面可以跟一个以连字符开头的可选预发布字符串。预发布字符串或补丁版本后可以跟以加号开头的构建元数据字符串。例如v0.0.0、v1.12.134、v8.0.5-pre、v2.0.9+meta等都是有效版本。版本号中的信息代表该版本是否为稳定版本,是否保持与之前版本的兼容性。当维护的模块发生一些不兼容的变化时,比如修改外部可调用的接口或函数,需要增加主版本号,将次版本号和补丁版本号设置为零。就像从模块中删除包一样。当在不影响模块兼容性的情况下,在模块中增加一些新的功能或接口时,需要增加次要版本号,并将补丁版本号设置为零。当修复了一些bug或者做了一些优化后,只需要增加补丁版本号,因为这些改变不会改变已经暴露的接口。pre-release后缀表示这个版本号是预发布版本。预发布版本号的顺序将在正式版本号之前。例如,v1.2.3-pre将排在v1.2.3之前。在版本比较中忽略元数据后缀,版本控制中的存储库忽略带有构建元数据的标签,但构建元数据保留在go.mod文件中指定的版本中。如果一个模块还没有迁移到GoModules并且主版本号是2或更高,+incompatible后缀将被添加到版本号。如果主版本号为0或具有预发布后缀,则认为该版本不稳定。通常,不稳定版本不受兼容性限制,例如v0.2.0可能不兼容v0.1.0,v1.5.0-beta可能不兼容v1.5.0。Go可以通过标签、分支和提交哈希来获取模块,即使命名不遵循这些规则。在主模块中,go命令会自动将这些修订转换成标准的版本号,称为伪版本号(pseudo-version)。例如,当执行以下命令时:goget-dgolang.org/x/net@daa7c041Go会将指定的哈希daa7c041转换为伪版本号v0.0.0-20191109021931-daa7c04131f5。主模块之外需要一个规范版本,如果go.mod文件中出现像master这样的非规范版本,go命令会报错。三:伪版本号伪版本号是一种预发布的版本号格式,其中包含指定的commithash值。另外,对于没有打标签的代码库,也可以用一个伪版本号来表示某个版本,方便在某个版本正式发布前进行测试。例如,每个伪版本号都包含三个部分:基本版本前缀(vX.0.0或vX.Y.Z-0),它来自修订版的前一个语义版本标签,或者来自vX.0.0(如果没有这样的标签)。时间戳(yyyymmddhhmmss),这是创建提交时的UTC时间。在Git中,这是提交时间。提交标识符(abcdefabcdef),它是提交哈希的12个字符前缀,或者在Subversion中,是一个零填充的修订号。在这三部分下,分为以下多种情况:如果之前没有baseversion,那么会启用一个伪版本号比如vX.0.0-yyyymmddhhmmss-abcdefabcdef。主版本号X需要与模块的主版本号后缀匹配。如果之前的基础版本号是像vX.Y.Z-pre这样的预发布版本,那么将使用vX.Y.Zpre.0.yyyymmddhhmmss-abcdefabcdef。如果之前的基础版本号是像vX.Y.Z这样的正式版本,那么就会使用vX.Y.(Z+1)-0.yyyymmddhhmmss-abcdefabcdef。例如,如果基本版本号是v1.2.3,则假版本号可能是v1.2.4-0.20191109021931-daa7c04131f5。基于不同的基础版本号,多个伪版本号可能指向同一个commithash。当标记低于现有版本号的伪版本号时会发生这种情况。上面介绍的伪版本号带有两个非常有用的信息:伪版本号会高于这些已有的基础版本号,但会低于后面生成的其他伪版本号。具有相同基本版本前缀的伪版本按时间顺序排序。不需要手动指定伪版本号。许多Go命令可以接受提交哈希或分支名称,并自动将其转换为伪版本号(或标记,如果存在)。例如:goget-dexample.com/mod@mastergolist-m-jsonexample.com/mod@abcd1234在这篇文章中,我们介绍了模块路径、版本号和兼容原则、伪版本号这三个概念.下篇我们将继续介绍GoModules的核心概念,包括主版本号后缀、包路径解析为模块路径的过程、go.mod文件,敬请期待。另外,腾讯云goproxy企业版已经商用,需要了解的同学可以点这里。李宝琨往期精彩推荐文章:Go语言重启、GoModules的前世今生和基本使用《云荐大咖》是腾讯云+社区的优质内容专栏。云推荐官特邀行业领袖,聚焦前沿技术落地与理论实践,持续为您解读云时代热点技术,探索行业发展新机遇。点击一键订阅,我们会定期为您推送优质内容。