Go Module碎碎念

2021-10-17  本文已影响0人  小餐包

本文主要参考文章,个人整理而成。

Go Modules是官方正式推出的包依赖管理项目,在Go Modules推出之前(Go1.13之前)存在两个蛋疼问题:

Go modules 出现的目的之一就是为了解决 GOPATH 的问题,也就相当于是抛弃 GOPATH 了。它有如下特点:

go.mod文件

go.mod 是启用了 Go moduels 的项目所必须的最重要的文件,它描述了当前项目(也就是当前模块)的元信息,每一行都以一个动词开头,目前有以下 5 个动词:

go.sum文件

go.sum类似于npm中的package-lock.json 这类文件,它详细罗列了当前项目直接或间接依赖的所有模块版本,并写明了那些模块版本的 SHA-256 哈希值以备 Go在今后的操作中保证项目所依赖的那些模块版本不会被篡改。但是必须注意的是,不同于其他语言,go.sum文件更新应该包含在你的提交中,以确保你的依赖模块可以100%被重新构建。

GOPROXY配置

这个环境变量主要是用于设置 Go 模块代理,它的值是一个以英文逗号 “,” 分割的 Go module proxy 列表,默认是proxy.golang.org,国内访问不了。这里要感谢盛傲飞和七牛云为中国乃至全世界的 Go 语言开发者提供免费、可靠的、持续在线的且经过CDN加速Go module proxy(goproxy.cn)。

其实值列表中的 “direct” 为特殊指示符,用于指示 Go 回源到模块版本的源地址去抓取(比如 GitHub 等),当值列表中上一个 Go module proxy 返回 404 或 410 错误时,Go 自动尝试列表中的下一个,遇见 “direct” 时回源,遇见 EOF 时终止并抛出类似 “invalid version: unknown revision...” 的错误。

国内推荐配置为:

export GOPROXY="https://goproxy.cn, direct"
# 或者
go env -w GOPROXY=https://goproxy.cn,direct

Vendor目录

有时由于一些网络原因我们可能无法下载我们需要的依赖,这时我们需要提前准备这些依赖。我们可以通过go mod vendor 命令输出我们所有的依赖到对应的 vendor 目录(位于我们自己的模组目录下),然后通过运行go build -mod vendor命令来强制使用vendor目录的依赖。

命令汇总

# 查看所有 go mod的使用命令
go mod
# module为项目目录名,生成 go.mod 文件
go mod init [module-name]
# 更新现有依赖
go mod tidy
# 下载 go.mod 文件中指明的所有依赖
go mod download 
# 查看项目所有依赖
go list -m all
# 查看现有的依赖结构
go mod graph
#  编辑 go.mod 文件
go mod edit
# 导出现有的所有依赖 (事实上 Go modules 正在淡化 Vendor 的概念)
go mod vendor
# 校验一个模块是否被篡改过
go mod verify
# 清理所有已缓存的模块版本数据。
go clean -modcache
# 更新主要模块,但是忽略单元测试
go get -u
# 更新所有模块,推荐使用
go get -u all
上一篇 下一篇

猜你喜欢

热点阅读