如何使用Go标准工具递归获取指定目录及其子目录下Go程序的所有包和依赖
报错原因
你遇到的code in directory [foo] expects import [bar]报错,是因为对应目录下的Go包声明了自定义规范导入路径(代码头部的// import "bar"注释)。在$GOPATH/src根目录执行go list时,Go工具链会基于根目录计算包的默认导入路径,和包声明的预期导入路径不匹配就会触发校验失败。而进入单个包目录执行命令时,相对路径计算出的导入路径刚好匹配声明内容,因此不会报错。
原生工具集解决方案
所有方案均使用Go官方自带工具,无需安装第三方组件:
方案1:忽略校验直接查询
执行以下命令即可忽略路径校验错误,输出所有可识别的包导入路径,如需其他信息可自行调整格式化模板:go list -e -f '{{.ImportPath}}' ./...如果需要同时输出版本信息(适用于Go mod管理的项目),可使用以下命令:
go list -e -f '{{.ImportPath}} {{if .Module}}{{.Module.Version}}{{end}}' ./...其中
-e参数的作用是让go list跳过错误的包,继续输出正常可识别的包信息,不会因为个别包校验失败就中断执行。方案2:遍历子目录逐个查询(100%兼容所有场景,支持包含vendor目录)
如果你需要覆盖所有子目录包括vendor,可配合系统自带的find工具遍历所有Go代码所在目录,逐个执行go list,完全规避根目录下的导入路径校验问题:
包含vendor目录的命令:find . -type f -name "*.go" -printf "%h\n" | sort -u | xargs -I {} go list -C {} .不需要包含vendor目录的命令:
find . -type d -name "vendor" -prune -o -type f -name "*.go" -printf "%h\n" | sort -u | xargs -I {} go list -C {} .方案3:Go mod项目快速查询
如果你使用Go mod管理依赖,直接在go.mod文件所在目录执行以下命令,即可快速拿到所有依赖包的导入路径和对应版本:go list -m all
内容的提问来源于stack exchange,提问作者the_endian
相关产品推荐
相关产品推荐

