首页 > temp > 简明python教程 >
-
24. 超详细解读 Go Modules 前世今生及入门使用(2)
接下来,进入项目目录,执行如下命令进行 go modules 的初始化(请忽略下面目录,没必要建目录,下篇说明
接下来很重要的一点,我们要看看 go install 把下载的包安装到哪里了?
上面我们观察到,在使用 go modules 模式后,项目目录下会多生成两个文件也就是 go.mod
和 go.sum
。
这两个文件是 go modules 的核心所在,这里不得不好好介绍一下。
go.mod 文件
go.mod 的内容比较容易理解
-
第一行:模块的引用路径
-
第二行:项目使用的 go 版本
-
第三行:项目所需的直接依赖包及其版本
在实际应用上,你会看见更复杂的 go.mod 文件,比如下面这样
module github.com/BingmingWong/module-test
go 1.14
require (
example.com/apple v0.1.2
example.com/banana v1.2.3
example.com/banana/v2 v2.3.4
example.com/pear // indirect
example.com/strawberry // incompatible
)
exclude example.com/banana v1.2.4
replace(
golang.org/x/crypto v0.0.0-20180820150726-614d502a4dac => github.com/golang/crypto v0.0.0-20180820150726-614d502a4dac
golang.org/x/net v0.0.0-20180821023952-922f4815f713 => github.com/golang/net v0.0.0-20180826012351-8a410e7b638d
golang.org/x/text v0.3.0 => github.com/golang/text v0.3.0
)
主要是多出了两个 flag:
-
exclude
:忽略指定版本的依赖包 -
replace
:由于在国内访问golang.org/x的各个包都需要翻墙,你可以在go.mod中使用replace替换成github上对应的库。
go.sum 文件
反观 go.sum 文件,就比较复杂了,密密麻麻的。
可以看到,内容虽然多,但是也不难理解
每一行都是由 模块路径
,模块版本
,哈希检验值
组成,其中哈希检验值是用来保证当前缓存的模块不会被篡改。hash 是以h1:
开头的字符串,表示生成checksum的算法是第一版的hash算法(sha256)。
值得注意的是,为什么有的包只有一行
<module> <version>/go.mod <hash>
而有的包却有两行呢
<module> <version> <hash>
<module> <version>/go.mod <hash>
那些有两行的包,区别就在于 hash 值不一行,一个是 h1:hash
,一个是 go.mod h1:hash
而 h1:hash
和 go.mod h1:hash
两者,要不就是同时存在,要不就是只存在 go.mod h1:hash
。那什么情况下会不存在 h1:hash
呢,就是当 Go 认为肯定用不到某个模块版本的时候就会省略它的h1 hash
,就会出现不存在 h1 hash
,只存在 go.mod h1:hash
的情况。[引用自 3]
go.mod 和 go.sum 是 go modules 版本管理的指导性文件,因此 go.mod 和 go.sum 文件都应该提交到你的 Git 仓库中去,避免其他人使用你写项目时,重新生成的go.mod 和 go.sum 与你开发的基准版本的不一致。
5. go mod 命令的使用
-
go mod init
:初始化go mod, 生成go.mod文件,后可接参数指定 module 名,上面已经演示过。 -
go mod download
:手动触发下载依赖包到本地cache(默认为$GOPATH/pkg/mod
目录) -
go mod graph
:打印项目的模块依赖结构
-
go mod tidy
:添加缺少的包,且删除无用的包 -
go mod verify
:校验模块是否被篡改过 -
go mod why
:查看为什么需要依赖 -
go mod vendor
:导出项目所有依赖到vendor下
-
go mod edit
:编辑go.mod文件,接 -fmt 参数格式化 go.mod 文件,接 -require=golang.org/x/text 添加依赖,接 -droprequire=golang.org/x/text 删除依赖,详情可参考go help mod edit