go mod 使用时的问题(指定版本)

时间:2025-03-02 09:43:16

先简单描述一下问题:
现在,我在开发go的项目中,用到了两个包 A@v1.1 和 B@v3.1,此时这两个包是可以相互支持的;

两天后(就是这个意思不一定真的是两天还有可能是两个月),A版本更新了,A@v1.3了,B的版本依然没有更新;而且A@v1.3与B@v3.1 不相互支持了,此时我们在项目中 进行 go mod tidy的时候,就会把最A的新的版本down下来,项目就会报错;

我们需要解决的问题就是,在使用go mod 的时候,指定在我们所需要的版本,不让他们随意更新

我们进行 go mod init 之后,进行第三方包的引入,文件一般是如下:

module demo

go 1.15

require (
	github.com/kataras/iris/v12 v12.2.0-alpha2
)

我们简单举一个例子 iris的版本为 v12.2.0-alpha2

这是我们在第一次引入的版本号;

那我想一直使用这个版本呢?

那我们直接在文件添加如下设置就可以指定他的版本号,不会自动更新

module demo

go 1.15

require (
	github.com/kataras/iris/v12 v12.2.0-alpha2
)


replace (
	github.com/kataras/iris/v12 => github.com/kataras/iris/v12 v12.2.0-alpha2
)

使用 replace 关键字 指定需要的包的版本号 就OK了;

在此,就多讲一点点吧,关于go env 和 go mod 的事情

在 go env 中有这两个参数:

GO111MODULE="on"
GOMODCACHE="/XXX/XXX/go/pkg/mod"

我不知道大家平时关注不关注这两个参数,在此我就简单记录一下

GO111MODULE 他有三个值:
on : go命令行会使用modules,不会去GOPATH目录下查找;而是去GOMODCACHE 这个地方查找
off : go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。
auto:默认值,使用该方式时,go命令行将会根据当前目录来决定是否启用module功能。

可以直接设置:
go env -w GO111MODULE=on
或者可以写成:
export GO111MODULE=on

在继续探讨:GOMODCACHE
这个就是 你在使用mod 来管理项目依赖的时候,下载的第三方包的存储目录,如果你不想使用 go mod,我想使用最平常的来管理项目的依赖,那你就吧这个文件夹下的所有依赖全部复制粘贴到你的GAOPATH下,项目就可以找到它所需的第三方的依赖了。

再继续添加知识点:

go mod download  //下载依赖包
go mod edit  //工具或脚本编辑
go mod graph  //打印模块依赖图
go mod init  //在当前目录初始化mod
go mod tidy  //拉取缺少的模块,移除不用的模块。
go mod vendor  //将依赖复制到vendor下
go mod verify  //验证依赖是否正确
go mod why  //解释为什么需要依赖
go list -m -json all  //依赖详情