GOPATH
意味着你所有的 Go 代码及其依赖项共享一个公共空间。

然而,值得注意的是,这种方法随着 Go 1.11 中 Go 模块的引入而发展。这主要解决了缺乏适当的依赖关系版本控制系统和在文件系统下存储项目的灵活性。

go.mod
GOPATHgo.modgo get 

然而,在继续之前,重要的是要弄清楚包是什么以及模块与包的区别:

Go 中的包

.go

包允许组织和重用代码。它们提供了一种将相关代码封装到一个单元中的方法,该单元可以被其他包导入和使用。例如,Go 标准库由许多包组成,例如 fmt、os、net 等。

mainmain()main()main

最好在项目的根文件夹中声明主包文件,在自己的目录中声明其他包。

Go 中的模块

模块是相关的 Go 包的集合,它们作为一个单元一起进行版本控制。模块记录精确的依赖需求并创建可重现的构建。

Go 模块由位于模块目录层次结构根目录下的 go.mod 文件定义。该文件定义了模块路径,即模块内所有包的导入路径前缀。它指定了模块的依赖关系,包括其他模块所需的版本。

srcGOPATH

总而言之,虽然包是一种在 Go 程序中构建和重用代码的方式,但模块是包的版本化集合,它还处理依赖管理。这允许每个 Go 项目都有自己的隔离和可重现的构建环境。

模块的命名约定

go.mod

以下是 Go 中模块命名的一些准则:

github.com/littlejohnny65/example-module
examplemodule
go.modv1.2.3

为模块选择有意义和描述性的名称很重要,因为它们是公开可识别的,并且可以在其他项目中用作依赖项。清晰一致的命名约定有助于理解模块的用途和上下文。

go.sum 文件

go get github.com/user/repo

Go 有一种非常灵活和直接的方法来从外部存储库下载依赖项。所以为了保证依赖的完整性所采用的解决方案是创建一个本地文件来存储每个依赖的校验和。这是保证安装的依赖项完全相同的原因。

校验和文件由本地 Go 工具生成。如果您想确保依赖项与本地环境中的依赖项完全相同,则应将其推送到服务器和 Dockerfiles 等外部环境。

模块化 Go 项目的文件树

go mod init: 在当前目录中初始化一个新模块。它创建一个go.mod定义模块路径的文件并将其设置为依赖管理。

go mod tidy:从文件中添加缺失和删除未使用的模块和依赖项go.mod。它确保go.mod文件准确反映项目所需的依赖项。

go mod download:下载文件中定义的依赖项go.mod,并将它们存储在模块缓存中。它获取项目所需的特定版本的依赖项。

go mod vendor:将依赖项复制到vendor项目中的目录中。当您想要创建一个包含其所有依赖项的独立项目时,此命令很有用。

go mod verify:验证模块缓存中的依赖项是否与go.sum文件中指定的预期加密校验和匹配。它确保下载的依赖项的完整性和真实性。

go mod graph:打印模块依赖图,显示模块及其版本之间的关系。它对于理解项目依赖项的整体结构很有用。

go mod edit:提供一系列用于对文件进行手动编辑的子命令go.mod。它允许您添加、删除或更新模块要求、替换模块等。

这些只是一些常用的go mod命令。go help mod您可以通过运行或参考关于模块的官方 Go 文档来探索更多命令及其选项。

包起来

模块化方法与单一工作区并无根本区别或不兼容。但它建立在它的基础上,以带来更多的灵活性和可管理性。

模块允许您在文件系统中的任何地方拥有一个项目,并且还具有命名空间依赖性以获得更好的稳定性。但它仍然使用 GOPATH 作为默认位置来存储依赖项和可执行文件。

总之,go.mod 提供的模块化环境是 Go 开发者工具箱中的一个强大工具,补充和扩展了传统 GOPATH 环境的功能。它标志着 Go 适应了现代软件开发的复杂性和规模不断增加,展示了该语言为满足其用户不断变化的需求而不断发展。

随着我们的前进,想象一下 Go 生态系统的未来发展将会令人兴奋。

(https://www.java567.com,搜go)