go mod 依赖管理

本文概述了Go语言依赖管理工具的发展历程,从最初的goget阶段到vendor解决包依赖问题,以及GoModules的指令操作,如gomodinit创建go.mod文件、gomoddownload下载依赖、gomodtidy整理依赖等,详细介绍了每个指令的作用和使用场景。
摘要由CSDN通过智能技术生成

目录

Go Modules发展史

go get阶段

vendor阶段

指令操作

指令1:go mod init + 模块名称

指令2:go mod download + 路径

指令3:go mod tidy

指令4:go mod edit

指令5:go mod vendor

指令6:go mod verify

指令7:go mod why


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仍然是拉取最新版本代码;

指令操作

关于指令讲解的b站视频

命令

作用

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

找原因的问题

  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值