Go modules基础精进,六大核心概念全解析

一:模块路径 (Module Path)

Go 使用 “module path” 来区分不同的 module 模块,它在 go.mod 文件中被定义,这个文件中还包含了这个模块编译所需的其他依赖。如果一个目录中包含了 go.mod 文件,那么这个目录就是这个 Go 模块的根目录了。
另外,还要介绍下包(package) 这个概念,它在 Go Modules 出现之前就已经存在了。Go 模块中的 “ 包 (package)” 是处于同一目录中的一些源代码文件的集合,这些文件将被编译在一起。 “ 包路径(package path) ” 是模块路径和子目录(模块根目录的相对路径)的组合。举个例子,在模块 “golang.org/x/net” 下的 html 目录中有个包,这个包的路径是 “golang.org/x/net/html” 。
总结下来就是: 一个代码仓库可以包含多个 Go 模块,一个 Go 模块可以包含多个 Go 包。
模块路径是一个 Go 模块的规范名称,用于区分不通的模块。同时他还是该模块下 Go 包的路径前缀。理论上,模块路径应该至少包含两个关键信息:

模块的作用
哪里获取该模块

二:版本号与兼容性原则

版本号相当于是一个模块的只读快照,它可以是正式的发布版本,也可以是预发布版本。 每个版本都以字母 v 开头,后跟一个语义版本,例如 v1.0.0。
总而言之,语义版本由三个由点分隔的非负整数(主要版本、次要版本和补丁版本,从左到右)组成。 补丁版本后可以跟一个以连字符开头的可选预发布字符串。 预发布字符串或补丁版本后可以跟一个以加号开头的构建元数据字符串。 例如,v0.0.0、v1.12.134、v8.0.5-pre、v2.0.9+meta 等都是有效版本。
版本号中的信息代表了这个版本是否是一个稳定版,是否保持了与之前版本的兼容性。

当维护的模块发生了一些不兼容变更,比如修改了外部可调用的接口或者函数时,需要对主版本号进行递增,并且将次版本号和补丁版本号置为零。比如在模块中移除了一个包。
在模块中添加一些新的函数或者接口,并没有影响模块的兼容性时,需要对次版本号进行递增,并且将补丁版本号置为零。
当修复了一些 bug 或者进行了一些优化时,只需要对补丁版本号进行递增就可以了,因为这些变更不会对已经公开的接口进行变更。
预发布后缀代表了这个版本号是一个预发布版本。预发布版本号的排序会在正式版本号的前面。举个例子,v1.2.3-pre 会排列在 v1.2.3 前面。

你可能感兴趣的:(golang)