Golang中如何检查go.mod有哪些模块需要更新

Golang中如何检查go.mod有哪些模块需要更新 我们拥有许多包含Go代码的代码库。Go模块在处理依赖关系方面确实带来了巨大改进。但工具链似乎仍有提升空间。

例如,我经常遇到一个简单的问题:由于存在新版本,我应用在go.mod文件中列出的哪些依赖项应该更新?

经过深入查找,可以在模块文档中找到这个命令:

go list -u -m all

实际上,我最初尝试不使用"all"参数,但那样不会返回任何结果——因为我们服务的所有代码都位于下一级的几个不同目录中。添加all选项后,会输出大量信息。不仅包含go.mod中的依赖信息,还包括它们的依赖项。这些信息确实有用,但很难据此判断哪些依赖需要升级。

我甚至无法通过工具本身过滤数据。(Go模板是否支持数据过滤功能?或者能否支持continue语句?)

好消息是使用-json参数可以输出数据并用其他工具处理。经过一番研究jq的用法,最终得到了这样的方案:

go list -u -m -json all | jq -r '. | select(.Update) | select(.Indirect == null) | .Path + "@" + .Version + " => " + .Path + "@" + .Update.Version'

这个命令显然需要设置别名或写成脚本,它能准确显示go.mod文件中哪些模块已过时,当前版本号以及应该更新的目标版本。

呼!其实我希望能有更简单的方法来解决这个基础问题。很期待听到更好的实现方式。或者,能否谦逊地请求增强工具链对实际开发中模块管理的支持?

附言:实际上我期望的功能远不止这些。比如能够获知常见库的特定版本是否存在安全漏洞。此外,当有人迁移代码库时(例如Sirupsen/logrus迁移至sirupsen/logrus,或garyburd/redigo迁移至gomodule/redigo),处理过程实在令人困扰。


更多关于Golang中如何检查go.mod有哪些模块需要更新的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang中如何检查go.mod有哪些模块需要更新的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go模块管理中,确实可以通过go list -u -m all命令结合其他工具来检查依赖更新。以下是更简洁的替代方案和示例代码:

1. 使用内置Go命令过滤

go list -u -m -f '{{if and (not .Indirect) .Update}}{{.Path}}: {{.Version}} -> {{.Update.Version}}{{end}}' all

2. 直接依赖更新检查

go list -u -m $(go list -m all) | grep -v indirect

3. Go脚本实现 创建check_updates.go

package main

import (
	"encoding/json"
	"fmt"
	"os/exec"
	"strings"
)

type Module struct {
	Path     string
	Version  string
	Update   *Update
	Indirect bool
}

type Update struct {
	Version string
}

func main() {
	cmd := exec.Command("go", "list", "-u", "-m", "-json", "all")
	output, err := cmd.Output()
	if err != nil {
		panic(err)
	}

	modules := strings.Split(string(output), "\n}\n")
	for _, modStr := range modules {
		if modStr == "" {
			continue
		}
		var mod Module
		if err := json.Unmarshal([]byte(modStr+"}"), &mod); err != nil {
			continue
		}
		if mod.Update != nil && !mod.Indirect {
			fmt.Printf("%s: %s -> %s\n", mod.Path, mod.Version, mod.Update.Version)
		}
	}
}

运行:

go run check_updates.go

4. 单行命令简化

go list -m -u all | awk '/\[/ {if($2 !~ /indirect/) print $1 " " $2 " -> " $4}'

这些方法能直接显示需要更新的直接依赖项,过滤掉间接依赖和无需更新的模块。对于安全漏洞检测,建议使用govulncheck工具:

go install golang.org/x/vuln/cmd/govulncheck@latest
govulncheck ./...
回到顶部