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
)

关键变化:

  1. 直接依赖和间接依赖分离:第一个 require 块包含直接依赖,第二个块包含间接依赖(标记为 // indirect
  2. 版本信息更清晰:这使得查看哪些是项目直接使用的依赖更加容易

示例代码变化:

当从 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 模块依赖管理的改进,旨在提供更好的可读性和维护性
回到顶部