go list -m -u all 输出无更新且 pkg.go.dev 显示“last updated > 12 months ago”的包基本已事实性停止维护;真正危险的是间接引入的“孤儿库”,需用 go list -m -u -json all | jq -r 'select(.update != null and .version != null and (.update.time | fromdateiso8601)
直接看
go list -m -u all输出里没有更新记录、且pkg.go.dev页面显示 “Last updated > 12 months ago” 的包,基本就是事实性停止维护;废弃与否不能只信注释,得查//go:deprecated是否真实存在并生效。怎么快速筛出长期没更新的间接依赖
真正危险的不是你
require的主包,而是某个二级依赖悄悄带进来的“孤儿库”。go list -m -u all虽能列出所有模块,但混在几百行里根本没法人工盯。
- 先过滤出超过半年没更新的:
go list -m -u -json all 2>/dev/null | jq -r 'select(.Update != null and .Version != null and (.Update.Time | fromdateiso8601 (需装 <code>jq;时间阈值 15768000 秒 ≈ 6 个月)- 再排除 Go 官方子模块(如
golang.org/x/net),它们更新节奏不同,不能按社区标准判“废弃”- 对命中结果,手动打开
https://pkg.go.dev/<var>module-path</var>,重点看右上角 “Last updated” 和下方 “Open issues” 数量 —— 若 last updated 是 2024 年前、open issues > 200、最近 commit 是 fork 自别人仓库,基本可标记为高风险为什么
// Deprecated:注释不等于真废弃很多包文档里写着
// Deprecated: use NewX instead,但调用时完全没警告。这不是你配置错了,是 Go 本身不解析它。
- 只有紧贴导出函数/类型声明、无空行、拼写精确的
//go:deprecated "use NewX instead"才会在go build时触发警告- 私有函数(小写字母开头)加了也无效;字符串参数不能为空,否则编译器忽略整条指令
- 如果你在 CI 里只跑
go test,而没跑go build ./...,那这个警告永远不出现- 更麻烦的是:有些包作者写了
//go:deprecated,但没发新 tag —— 你go get拉到的还是旧版,根本没包含那行指令如何让废弃提示在 IDE 和文档里都可见
光靠编译警告不够,团队里有人不跑构建、有人只看
pkg.go.dev页面。必须三手准备。
- 在函数文档注释首行写
// Deprecated: use NewX instead,确保godoc和pkg.go.dev渲染成弃用区块- 同时在下一行紧贴加上
//go:deprecated "use NewX instead",保证go build报警- 用
staticcheck(配-checks U1000)扫描未加//go:deprecated但文档含Deprecated:的导出项,CI 中强制失败- 别忘了检查
go.mod里的replace—— 如果你用replace github.com/bad/pkg => ./local-fork,而 fork 本身也没人维护,那只是把风险从远程换到了本地预警机制不能只靠人肉翻页面
定期扫
pkg.go.dev不现实,但自动化又容易误报。关键在于区分“真停更”和“低频但健康”的项目。
- 真停更特征:last updated > 12 个月 + 最近 3 个 tag 都是 v0.x + GitHub repo stars 增速归零 +
go list -m -f '{{.Indirect}}' github.com/bad/pkg返回true(确认是间接引入)- 在 CI 中加一步:用
curl -s "https://proxy.golang.org/github.com/bad/pkg/@v/list" | tail -n1看最新 tag 时间,比访问网页更稳定- 最易被忽略的一点:某些包虽未明确废弃,但已迁移到新路径(如
gopkg.in/yaml.v2→github.com/go-yaml/yaml),旧路径不再同步更新 —— 这类必须查 import 语句是否还在用老地址
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!












