首页 > 技术文章 > 模块路径

gyshht 2021-12-16 14:00 原文

  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 或者进行了一些优化时,只需要对补丁版本号进行递增就可以了,因为这些变更不会对已经公开的接口进行变更。郑州看心理医生哪家好http://www.hyde8871.com/

  预发布后缀代表了这个版本号是一个预发布版本。预发布版本号的排序会在正式版本号的前面。举个例子,v1.2.3-pre 会排列在 v1.2.3 前面。

  元数据后缀会在版本比对中被忽略,版本控制中的代码库会忽略带有构建元数据的标签,但在 go.mod 文件中指定的版本中会保留构建元数据。如果一个模块还没有迁移到 Go Modules 并且主版本号是 2 或者更高,+incompatible 后缀会被添加到版本号上。

  如果一个版本的主版本号是 0 或者它有一个预发布版本后缀,那么这个版本被认为是一个不稳定版本。通常,不稳定版本不受兼容性限制的,举个例子,v0.2.0 可能和 v0.1.0 是不兼容的,v1.5.0-beta 可能和 v1.5.0 也是不兼容的。

  Go 可以通过 tags、分支、和 commit 哈希值来获取模块,即使这些命名没有遵循这些规则。在主模块中,go 命令会自动的将这些 revision 转化为符合标准的版本号,其被称为伪版本号(pseudo-version)。举个例子,当执行下面的命令时:

  go get -d golang.org/x/net@daa7c041

  Go 会讲指定的 hash daa7c041 转化为一个伪版本号 v0.0.0-20191109021931-daa7c04131f5。在主模块之外需要规范版本,如果 go.mod 文件中出现像 master 这样的非规范版本,go 命令会报错。

推荐阅读