Topic

  • 模块化
  • 版本管理
  • 打包与版本
  • private repository
  • 多人协作开发

模块化

Go 语言在 v1.11 之前,采用的是 $GOPATH 的方式来引用第三方包的 src 文件. 这样做带来的灾难是没有办法处理多版本的问题。

于是在 v1.11之后引入了mod ,在新版本的go环境下,执行下面的命令将能看到3个文件

ls $GOPATH
# bin pkg src

所有的依赖的包都在pkg下存在 比如在pkg/mod/golang.org/x 下存在的如下的包

net@v0.3.0
net@v0.5.0
oauth2@v0.0.0-20220411215720-9780585627b5
sync@v0.0.0-20220819030929-7fc1605a5dde
sync@v0.1.0
sys@v0.0.0-20200302150141-5c8b2ff67527
sys@v0.1.0
sys@v0.2.0

Go语言提供了很好的模块化支持,可以让开发者将程序分割成更小的、独立的代码模块,这样有助于降低复杂性、提高可维护性、可重用性和测试性。以下是Go语言的模块化相关的一些特性和最佳实践:

  • 包:Go程序的基本单位是包,每个Go源代码文件都必须属于一个包,且包名必须与其所在的目录名一致。包可以是库包,也可以是可执行包。库包用于封装通用的功能,而可执行包用于实现独立的应用程序。

  • 导入:Go语言使用import关键字来导入其他包,导入的包名就是包的名称。可以使用相对路径或绝对路径指定要导入的包。

  • 可见性:Go语言的可见性规则非常简单:以大写字母开头的标识符对其他包可见,其他标识符只对本包可见。这种规则可以让包提供一些公共的接口,同时隐藏其内部实现细节。

  • 版本控制:Go语言使用模块来管理依赖关系和版本控制。每个模块都有一个唯一的模块路径和版本号。Go模块支持语义化版本控制,可以避免依赖冲突和版本升级的问题。

  • 依赖管理:使用go mod命令可以管理Go模块的依赖关系。可以使用go.mod文件指定依赖关系和版本信息,使用go.sum文件记录依赖的哈希值,确保依赖的代码不会被篡改或变化。

  • 构建和发布:使用go build命令可以构建可执行文件或库文件,使用go install命令可以将库文件安装到$GOPATH/pkg目录下,以便其他Go程序可以引用。可以使用go get命令从远程仓库获取依赖的代码,使用go mod tidy命令清理不需要的依赖。

注意,go语言的版本必须大于 1.11

模块化可以让程序依赖外部的模块,依赖本身会产生一个graph。 许多语言都有类似的辅助工具来进行依赖管理,如 Java中的MavenGradle, PHPcomposer

go 语言是如何进行依赖管理的呢?

go语言的依赖

Go语言使用模块(module)来管理依赖,模块是一组相关的Go包的集合,通常位于一个版本控制仓库中。Go模块支持语义化版本控制,并且可以解决依赖管理和版 本管理的问题。以下是Go语言依赖管理的一些关键点:

  • go.mod文件:每个Go模块都需要一个go.mod文件来指定模块的名称、版本号和依赖关系。在go.mod文件中,可以指定依赖包的名称、版本范围和仓库地址。例如:
module example.com/mymodule

require (
    github.com/some/package v1.2.3
    github.com/another/package v0.0.0-20220101010101-abcd12345678
)
  • go.sum文件:go.sum文件记录了模块的哈希值,可以用来验证模块的完整性和安全性。当下载依赖包时,Go会自动检查go.sum文件中的哈希值和实际下载的包的哈希值是否一致,如果不一致,则会给出警告并且停止下载。这可以有效避免依赖包被篡改或者发生其他安全问题。

  • go get命令:go get命令用于从远程仓库获取依赖包,并自动更新go.mod和go.sum文件。例如,以下命令可以获取并安装github.com/some/package:

go get github.com/some/package

如果没有指定版本号,则会下载最新的稳定版本。如果要下载特定版本的包,可以在包名后加上@符号和版本号。例如,以下命令可以下载v1.2.3版本的github.com/some/package

go get github.com/some/package@v1.2.3

还可以使用go mod vendor命令将所有的依赖包复制到vendor目录中,以便在没有网络连接的情况下使用。例如:

go mod vendor