乐趣区

关于go:Golang-遇到-note-module-requires-Go-1nn-解决之道不升go

Golang 遇到 note: module requires Go 1.xx 解决之道,不升 go

在应用多版本的 golang 的小伙伴,往往会遇到这个问题。本文就如何不降级 go 版本来解决该问题。

怎么产生的

  1. 同时应用 IDE 和命令行,命令行 go 版本和 IDE 的 go 不是同一个版本。
  2. 多人合作同一个我的项目,他人应用不同版本的 go 退出了一个包且写入了一个较高版本号。
  3. go get 时抉择了较高版本。

网上的大部分解决方案都是降级本人的 go 版本。那么如果不想降级有方法解决么?

不升 Go 版本

例如我遇到了:

# golang.org/x/sys/unix
../../go/pkg/mod/golang.org/x/sys@v0.3.0/unix/syscall.go:83:16: undefined: unsafe.Slice
../../go/pkg/mod/golang.org/x/sys@v0.3.0/unix/syscall_darwin.go:95:8: undefined: unsafe.Slice
../../go/pkg/mod/golang.org/x/sys@v0.3.0/unix/syscall_unix.go:118:7: undefined: unsafe.Slice
../../go/pkg/mod/golang.org/x/sys@v0.3.0/unix/sysvshm_unix.go:33:7: undefined: unsafe.Slice
note: module requires Go 1.17

尝试把 go.sum 删掉,再 go mod tidy 还是没用,仍然报这个错。

这时看看 go.mod 文件

module github.com/PaulXu-cn/xxx

go 1.15

require (
    github.com/go-faker/faker/v4 v4.0.0-beta.4
    github.com/golang/protobuf v1.5.2
    github.com/snksoft/crc v1.1.0
    github.com/spf13/cobra v1.6.1
    github.com/spf13/viper v1.15.0
)

也就是说以后我的 go runtime1.15 的,
是援用了基于 go1.17 的包,须要把这个包降为依赖 go1.15 的即可。那这里的哪个包须要降版本呢?

该我的项目简略,只有 5 个间接依赖,能够通过顺次删除增加测进去,如果有很多依赖的话,又该怎么解决呢?

包前面带 // indirect 是间接依赖,删掉这一行不影响。
参考 https://go.dev/ref/mod

上工具

这里介绍个工具 gmchart,go mod 图像化展现工具 —— https://github.com/PaulXu-cn/…

进入工作我的项目

cd goProejct

装置 gmchart

$ go install github.com/PaulXu-cn/go-mod-graph-chart/gmchart@latest

运行

$ go mod graph | gmchart
go mod graph version v0.5.3
the go mod graph will top in 60s
visit it by http://127.0.0.1:59760

go mod graph 是官网工具命令。可展现出了该我的项目所有的依赖关系,只不过是文本模式展现,输入的内容多了,人眼看不出啥来。这里借用 gmchart 工具,能够将其依赖关系组织为 树状 渲染 web 页面,也就是和 go 工具一样,跨平台的。

利用工具找问题

回到咱们刚刚的报错啊, golang.org/x/sys 包依赖了 go1.17.

这里咱们搜一下啊

呦,一下 84 个,咱们再把版本号输出进去,放大范畴

好的,定位到了 1 个,那就是它了,而后呢?

看了看 go.mod , 如同咱们也没有间接援用它,要去 go.mod 删也没有得删。

如果是如下状况,带有 indirect 正文的,删除了也不能解决问题!

require(golang.org/x/sys v0.3.0 // indirect)

这里有大聪慧,倡议我去 go.sum 外面去删,这是没用的哈,go mod tidy 一下又回来了。

找出间接依赖

  1. 用工具找到具体包
  2. 在界面中点击包
  3. 查看所有引入了该包的 包。这里咱们看到了 5 个包,viper 这个包是间接依赖,因而该调整这个包的版本
  1. 在 github 上找到 viper https://github.com/spf13/viper
  2. 关上 go.mod —— https://github.com/spf13/vipe…
  3. 我的项目要求是不高于 go1.15,那么 viper@1.9.0 是以后版本最高且要求不高于 go1.15 的。https://github.com/spf13/vipe…
  1. 把我的项目中 go.mod, 依赖—— viper 版本改为 v1.9.0 报错就解决了。

总结

我最近在做我的项目时,切换 go 版本遇到了该问题,棘手查了下,发现网上的答案都时让其降级 go 版本,其实就是依赖高版本的第三方包,这里借用工具,找出该包,通过降第三方包的形式也能解决该问题。

如果大家遇到同类问题,不想升 go 版本,能够试试改计划。

没有遇到也没关系,珍藏一下,某天遇到了不想升 go 能够再翻出来看看

参考

  • https://go.dev/ref/mod
  • https://github.com/PaulXu-cn/…
退出移动版