Golang中`go get -u -t ./...`和`go get -u -t all`有什么区别?

Golang中go get -u -t ./...go get -u -t all有什么区别? go get -u -t ./...go get -u -t all 之间有什么区别?

我不确定升级所有依赖项(包括传递依赖)的正确方法是什么。具体来说,go get -u -t ./... 似乎没有升级我的一些间接依赖,而 go get -u -t all 似乎还向 go.mod 添加了内容并升级了其他东西?

我对这两个命令之间的区别以及升级逻辑是如何工作或应该如何工作感到相当困惑。

2 回复

你好,欢迎!:slight_smile: !./...(在Go语言尽量少依赖的哲学中最常用)引用了当前包及其所有子包的依赖(仅限直接依赖),而当你想要同时更新直接依赖和间接依赖(未在任何文件中导入,或由你的直接依赖导入的依赖)时,all 就很有用。后者在以下情况很常见:如果你想确保所有组件都能正常工作,如果你的直接依赖本身又依赖了其他包,或者你想更新一个暂时未使用的依赖以避免将来出现问题。

func main() {
    fmt.Println("hello world")
}

更多关于Golang中`go get -u -t ./...`和`go get -u -t all`有什么区别?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


go get -u -t ./...go get -u -t all 在依赖升级范围上有本质区别:

go get -u -t ./...:升级当前模块及其子目录中所有包的直接依赖./... 模式匹配当前目录下的所有包,但不会处理测试依赖的间接依赖。

go get -u -t all:升级整个模块依赖图中的所有依赖(包括直接和间接依赖)。all 是特殊模式,代表主模块及其所有依赖包的可达集合。

关键区别在于间接依赖的处理。示例:

// go.mod
module example.com/main

require (
    example.com/direct v1.0.0
)

// 假设 example.com/direct 依赖 example.com/indirect v1.0.0

执行 go get -u -t ./... 只会尝试升级 example.com/direct 到最新版本,但不会主动升级 example.com/indirect,除非 example.com/direct 的新版本要求不同的间接依赖版本。

go get -u -t all 会同时检查并升级 example.com/directexample.com/indirect 到最新兼容版本。

go get -u -t all 可能向 go.mod 添加新依赖,因为它会解析 all 模式下的所有测试依赖。如果测试中引用了未在 go.mod 中声明的包,该命令会自动添加它们。

对于升级所有依赖(包括间接依赖),正确命令是:

go get -u ./... && go mod tidy

或者使用 Go 1.16+ 的推荐方式:

go get -u all
go mod tidy

go mod tidy 会清理未使用的依赖并更新 go.sum。注意 go get all 在 Go 1.18 后已弃用,但 go get -u all 仍可用于升级。

回到顶部