目录
Go Modules发展史
go get阶段
起初Go语言在1.5之前没有依赖管理工具,若想引入依赖库,需要执行go get命令将代码拉取放入GOPATH/src目录下,作为GOPATH下的全局依赖,这也就意味着没有版本控制及隔离项目的包依赖;
vendor阶段
为了解决隔离项目的包依赖问题,Go1.5版本推出了vendor机制,环境变量中有一个GO15VENDOREXPERIMENT需要设置为1,该环境变量在Go1.6版本时变成默认开启,目前已经退出了历史舞台;
vendor其实就是将原来放在GOPATH/src的依赖包放到工程的vendor目录中进行管理,不同工程独立地管理自己的依赖包,相互之间互不影响,原来是包共享的模式,通过vendor这种机制进行隔离,在项目编译的时候会先去vendor目录查找依赖,如果没有找到才会再去GOPATH目录下查找;
优点:保证了功能项目的完整性,减少了下载依赖包,直接使用vendor就可以编译
缺点:仍然没有解决版本控制问题,go get仍然是拉取最新版本代码;
指令操作
命令 | 作用 |
go mod init | 生成go.mod文件 |
go mod download | 下载go.mod文件中指明的所有依赖放到全局缓存 |
go mod tidy | 整理现有的依赖,添加缺失或移除不使用的modules |
go mod graph | 查看现有的依赖结构 |
go mod edit | 编辑go.mod文件 |
go mod vendor | 导出项目所有的依赖到vendor目录 |
go mod verify | 校验一个模块是否被篡改过 |
go mod why | 解释为什么需要依赖某个模块 |
指令1:go mod init + 模块名称
生成go.mod文件
go mod init gomod # gomod:我们自定义的模块名称
结果:
如果直接 go mod init
结果:
go.mod 文件的内容解释
// practice:模块名
module practice
// golang sdk 版本
go 1.18
// 指定项目第三方依赖
require (
// 依赖(路径) 和 版本号
// dependency latest
)
// 例子:
require (
github.com/faiface/beep v1.1.0
github.com/hajimehoshi/ebiten/v2 v2.6.3
)
// 排除第三方依赖
// 需要排除的原因:
// 1.可能我们依赖了某个模块,这个模块又依赖了其他的模块,其他的模块 对我们来说没有用
// 2.第三方模块有bug,在某些情况下不能用
exclude (
// dependency latest
)
// 替换第三方依赖,路径或版本号
replace (
// source latest => target latest
)
// 撤回有bug的版本
retract (
v1.0.0
v1.1.0 // 多个版本有问题
)
指令2:go mod download + 路径
下载
下载到的位置:
指令3:go mod tidy
依赖对齐(版本缺少的添加,版本多出来的删除),更新依赖文件
使用 go mod download 路径,只会下载当前的包,但是如果这个包也要依赖其他的依赖,那么第二个依赖就没有下载,我们可以通过go mod tidy,所有间接要依赖的东西都会被下载。
使用go mod tidy:
如果要需要间接依赖包,我们使用go mod tidy之后,Go 会下载模块的特定版本,并将模块的版本和其依赖项的哈希值写入。
go.sum 文件。(会产生新文件:go.sum)
go.sum 文件是 Go 语言模块化开发中的一个重要文件,用于记录模块依赖关系的哈希值。这个文件确保了项目在不同环境中使用相同的依赖版本,以避免因为依赖版本不一致而导致的问题。
指令4:go mod edit
用来手动编辑 go.sum 文件。
例子:
结果:
运行:go mod edit -retract="v1.0.0"
再运行:go mod edit -dropretract="v1.0.0"
retract v1.0.0 就被删除了
指令5:go mod vendor
将go.mod 文件下的所有依赖备份到vendor文件夹下。
(将依赖转移到本地的vendor文件)
也就是将这些文件:
然后我们就可以删除红框里的文件了,因为vendor 里面有备份了。(但是最好不要删除)
当我们创建了vendor 文件夹,go.mod文件中依赖找不到了(关于依赖的路径报红),删除vendor文件夹后,依赖又找到了,原因?
如果有vendor 文件夹,就会去读取vendor里面的依赖,如果没有vendor文件夹,就会去go/pkg/mod/cache里面找依赖。因为我们创建的vendor文件夹是空的,所以依赖找不到了,所以go.mod 文件中引用的依赖会报红。
指令6:go mod verify
验证所依赖的mod是否发生改变。(校验依赖)
如果出现,说明没有改变:
指令7:go mod why
找原因的问题