【Go学习合集】go mod 学习详解

Module的概念

  1. 相关 Go 包的集合,这些包作为一个单元一起进行版本控制
  2. 与 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=
  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值