如何检测 go 项目管道中已弃用的直接依赖项

How to detect deprecated direct dependencies in a pipeline for a go project

我正在尝试检测 go 项目中直接弃用的依赖项。为此,我在 模块弃用评论 部分下创建了一个虚拟项目 deptest which has depricon direct dependency. As stated in go1.17 release notes,应该可以使用 go list -m -u 获取弃用的依赖项。但是当我 运行 我的项目中的命令时,我得到:

$ go list -m -u 
github.com/zbindenren/deptest

我仅在使用以下命令时看到弃用警告:

$ go get ./...
go: module github.com/zbindenren/depricon is deprecated: This module is not maintained anymore.

或与:

$ go list -m -u all
github.com/zbindenren/deptest
github.com/zbindenren/depricon v0.0.1 (deprecated)

但是使用第二个命令我也得到了所有间接弃用的依赖项。

我的问题是:这是 go list -m -u 不显示已弃用模块的错误吗?是否有比 运行ning go get ./... 更好的方法来检查已弃用的模块?

首先,当你 运行 go list -m -u 没有模块参数时,它只列出主模块 (source):

The -m flag causes go list to list modules instead of packages. [...] If no arguments are specified, the main module is listed.

然后,Go 1.17 的发行说明实际上指出:

go list -m -u prints deprecations for all dependencies (use -f or -json to show the full message)

因此 运行 使用包含已弃用依赖项的模块参数,并指定格式:

$ go list -m -u -f '{{.Path}} {{.Deprecated}}' all
github.com/zbindenren/deptest 
github.com/zbindenren/depricon This module is not maintained anymore.

如果您只想将输出限制为 直接 依赖项,请使用模板技巧:

$ go list -m -u -f '{{if not .Indirect}}{{.Path}} {{.Deprecated}}{{end}}' all

或者等待 this proposal 通过。