翻译自 https://faun.pub/understanding-go-mod-and-go-sum-5fd7ec9bcc34
在这篇博客中,我将尝试介绍go模块的基本原理,以及GoLang项目中的依赖管理是如何工作的。
我将尝试解释一些常用的命令,如go mod tidy,go mod vendor,以及GoLang中的mod cache。
go.mod文件是GoLang中依赖管理的根基。所有在项目中需要或使用的模块都在go.mod文件中维护。
对于所有我们要在项目中导入/使用的包,它将在go.mod中创建这些模块的条目。
有了go.mod文件,就省去了为每个依赖的模块运行go get命令来成功运行项目的麻烦。
(如果想安装一个特定的软件包,我们可以用go get命令来安装,例如:go get go.mongodb.org/mongo-driver)
go mod init - 创建一个新模块,初始化描述该模块的go.mod文件。开始时,它只在go mod文件中添加模块路径和go版本。
在第一次运行任何软件包构建命令,如go build、go test之后,它将安装所有具有特定版本的软件包,即当时的最新版本。
它还会创建一个go.sum文件来维护校验和,所以当你再次运行该项目时,它不会再次安装所有的包。
而是使用存储在$GOPATH/pkg/mod目录(模块缓存目录)中的缓存。
go.sum是一个生成的文件,你不需要编辑或修改这个文件。
现在go.mod已经添加了所有在 "require "节点上有版本的模块,一个go.mod的样本文件看起来是这样的。
"module"意味着为版本控制而维护的网址,即模块声明。
go 1.14是本项目使用的golang版本,是创建go mod时的最新版本。
"require"将包括所有依赖模块和我们将在项目中使用的相关版本
"replace"指向Go中某个依赖模块的本地版本,而不是git-web。
它将创建一个有可用版本的vendor的本地副本,所以当我们想引用该vendor时,不需要每次都安装。
"//indirect"意味着我们在项目中没有使用这些依赖,但有一些模块导入了这些依赖。
所有的横向依赖都是间接的,这些包括我们项目需要正常工作的依赖。
使用go mod tidy
它将绑定项目中的当前导入文件和go.mod中列出的包。go mod tidy确保go.mod文件与模块中的源代码相匹配。
它添加任何缺失的模块需求,以构建当前模块的包和依赖,如果有一些不使用的依赖,go mod tidy将相应地从go.mod中删除这些。
它还会在go.sum中添加任何缺失的条目并删除不必要的条目。
当我们升级go.mod中某个特定软件包的版本时,我们需要运行go mod tidy命令来更新go.sum中的校验和。
使用go mod vendor
它生成了一个带有可用版本的vendor目录。它把所有第三方的依赖关系复制到你的项目根目录下的vendor文件夹。
这将添加所有运行vendor包所需的过渡性依赖。
当vendoring被启用时,go命令将从vendor目录中加载包并使用那些下载的包,而不是从模块源下载模块到模块缓存中。
go clean -modcache
该命令用于清除保存在$GOPATH/pkg/mod的mod缓存。这条命令用来删除已安装的软件包。
-modcache标志会删除整个模块下载缓存,包括版本依赖的未打包的源代码。