Golang中Go mod tidy 1.17重复require问题解析
Golang中Go mod tidy 1.17重复require问题解析 我注意到在我的一个项目中,go.mod 文件包含:
go 1.16
如果我将它改为 1.17 并运行 go mod tidy,它会复制整个 require() 块。这是 1.17 版本的新特性吗?还是一个错误?
5 回复
我也遇到了同样的问题,对此有任何建议吗?请回复。提前感谢。
更多关于Golang中Go mod tidy 1.17重复require问题解析的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
有两个部分用于区分直接依赖和间接依赖。 这是一个新功能。
这是一项新功能,Go 1.17 已发布 - Go 官方博客
在一个简单的项目中尝试了,同样的情况发生了……我可以安全地认为这是正常的吗?
module github.com/narven/example-go-mod
go 1.17
require github.com/valyala/fasthttp v1.30.0
require (
github.com/andybalholm/brotli v1.0.2 // indirect
github.com/klauspost/compress v1.13.4 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect
)
module github.com/narven/example-go-mod
go 1.16
require github.com/valyala/fasthttp v1.30.0
这是 Go 1.17 引入的新特性,不是错误。Go 1.17 对 go.mod 文件的格式进行了调整,将 require 指令分为两个部分:
Go 1.16 及之前版本:
module example.com/myproject
go 1.16
require (
github.com/example/dependency v1.2.3
github.com/another/package v0.1.0
)
Go 1.17 及之后版本:
module example.com/myproject
go 1.17
require (
github.com/example/dependency v1.2.3
github.com/another/package v0.1.0
)
require (
github.com/some/indirect v2.0.0 // indirect
)
关键变化:
- 直接依赖和间接依赖分离:第一个
require块包含直接依赖,第二个块包含间接依赖(标记为// indirect) - 版本信息更清晰:这使得查看哪些是项目直接使用的依赖更加容易
示例代码变化:
当从 Go 1.16 升级到 1.17 时,go mod tidy 会自动重新组织 go.mod 文件:
# 将 go.mod 中的版本改为 1.17
echo "go 1.17" > go.mod
# 运行 go mod tidy 重新整理依赖
go mod tidy
运行后,你会看到类似这样的结构:
module example.com/myproject
go 1.17
require (
github.com/gin-gonic/gin v1.7.4
github.com/go-sql-driver/mysql v1.6.0
)
require (
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/go-playground/locales v0.13.0 // indirect
github.com/go-playground/universal-translator v0.17.0 // indirect
github.com/golang/protobuf v1.5.2 // indirect
golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
)
注意:
- 这种格式变化是向后兼容的,Go 1.16 仍然可以读取 Go 1.17 格式的
go.mod文件 - 如果你降级到 Go 1.16,
go mod tidy会将格式恢复为单个require块 - 这是 Go 模块依赖管理的改进,旨在提供更好的可读性和维护性

