Module的概念
- 相关 Go 包的集合,这些包作为一个单元一起进行版本控制
- 与 respository、package的区别
- 一个responsitory包含一到多个module
- 每个module包含一到多个package
- 每个package在一个单独的目录里包含一到多个go源文件
Go Mod的使用
命令 | 用途 |
---|---|
download | 下载modules到本地cache |
edit | 使用工具或脚本编辑go.mod文件 |
graph | 打印现有的模块依赖图 |
init | 初始化一个新模块到本地 |
tidy | 添加缺失并去除无用的模块 |
vendor | 把当前依赖复制出一个vendor包 |
verify | 校验依赖是预期的内容 |
why | 解释为什么包和模块是需要的 |
edit
// json格式输出go.mod
go mod edit -json
// go.mod里新增一条require
go mod edit -require edu.prek.ef@v1.1
// go.mod里新增一条replace
go mod edit -replace xxxxxx/api/eapi@v0.0.0-20210104013524-476fa21a862f=Code/go/src/xxxxxx/byteapi/byteapi
// 场景:
1. 使用go mod edit -json获取go.mod数据
2. 使用go mod edit [ -require, -exclude ...] 修改数据
// 更多
go help mod edit
graph
这里不推荐使用,不是很好用
vendor
不推荐使用
verify
go mod verify
// 有本地包被修改的情况
code.byted.org/ex_kid/gocommon v0.0.2: dir has been modified (/Users/bytedance/Code/go/pkg/mod/code.byted.org/ex_kid/gocommon@v0.0.2)
// 全部校验通过的情况
all modules verified
// 检查范围:go list -m all
go.mod & go.sum
go.mod
// 用于定义当前项目的模块路径
module xxxxxxxx/prek/ef_api
// 用于设置预期的 Go 版本
go 1.16
// go 1.16 (2021-02-16)新增:软撤回指定版本。
// 开发者在发布的新版本里retract某些旧版本后,旧版本的使用者在go get/list的时候就会warning提示使用者旧版本的需要被撤回及撤回的原因。
retract 0.0.2
// 用于需求一个特定的模块版本
require (
// 发布了tag的
xxxxxxxx/edu/common v1.9.33
// 没有tag的,则用commit_id来指定版本
xxxxxxxx/gopkg/pkg v0.0.0-20200121054159-68e4480616b8
// 简介引用的,出现原因有多种情况:
// 1. A->B->C; 但B没有使用gomod,则会将C加到A的mod中,且indirect
// 2. A->B->C,D; B中go.mo没有记录C,则会将D加到A的mod中,且indirect
// 3. A->B1.1->C ==> A->B1.2->D; 则C依然会出现在mod中,并indirect
xxxxxxxx/gopkg/metrics/v3 v3.1.0 // indirect
// 不兼容:对于v2+的版本,go会自动加上此标签
// 因为按照约定import需要在后面/v2+需要项目管理人员自己维护(暂时做不到自动处理)
xxxxxxxx/kite/kitc v3.10.14+incompatible
)
// 用于从使用中排除一个特定的模块版本
exclude (
xxxxxxxx/ex_kid/gocommon v0.0.3
)
// 用于将一个模块版本替换为另外一个模块版本,通常用于本地的调试
replace (
xxxxxxxx/api/api v0.0.0-20210104013524-476fa21a862f => /xxxxxxxx/Code/go/src/code.byted.org/api/api
)
go.sum
// 罗列了当前项目直接或间接依赖的所有模块版本,并写明了那些模块版本的 SHA-256 哈希值
// 利用go校验命令可以同缓存在本地的依赖包副本元信息进行对比校验,不匹配时报错
// 通常一个module有两行:
// 第一行是module的zip文件的hash值,即:h1 hash。
// Go modules 将目标模块版本的 zip 文件开包后,针对所有包内文件依次进行 hash,然后再把它们的 hash 结果按照固定格式和算法组成总的 hash 值。
// 第二行是go.mod文件的hash值
bou.ke/monkey v1.0.2 h1:kWcnsrCNUatbxncxR/ThdYqbytgOIArtYWqcQLQzKLI=
bou.ke/monkey v1.0.2/go.mod h1:OqickVX3tNx6t33n1xvtTtu85YN5s6cKwVug+oHMaIA=
// 当go认为我们的项目用不着时,只保留了go.mod的hash值
xxxxxxxx/doc/mongo-go-driver v1.0.4/go.mod h1:nW/WyvoxVPL7rawTgIc/qvKGTgxfTMvyB/YdPwbiIlQ=
xxxxxxxx/bytedoc/mongo-go-driver v1.0.9/go.mod h1:N6XfuLQNIVGP05ZCgJswlqi3eEBviYW4eiZ8cgrUIfo=