如何在多Go模块父目录运行go test并在测试失败时返回非零码
解决Go测试失败时返回非零退出码的问题
原命令find . -name go.mod -execdir go test ./... \;测试失败时始终返回0,核心原因是**find的退出码仅反映自身执行是否正常,不会传递-execdir中go test的退出结果**——只要find完成了文件遍历与命令执行,不管测试成功与否,它都会返回0。
以下是几种实现测试失败时返回非零值的方法:
方式一:用Shell循环替代find
直接遍历所有go.mod文件,逐个进入对应目录执行测试,一旦某组测试失败就立即终止并返回非零码:
for mod in $(find . -name go.mod); do cd "$(dirname "$mod")" && go test ./... || exit 1 cd - >/dev/null done
方式二:用find配合bash子命令
通过bash子命令捕获go test的退出状态,失败时让整个命令链返回非零:
find . -name go.mod -execdir bash -c 'go test ./... || exit 1' \; | true; [ ${PIPESTATUS[0]} -ne 0 ] && exit 1
或者利用find的-o选项,在子命令失败时触发退出逻辑:
find . -name go.mod -execdir go test ./... \; -o -exit 1
方式三:使用xargs结合Shell命令
通过xargs传递目录路径,在Shell子进程中执行测试,任意一组测试失败都会让整个命令返回非零:
find . -name go.mod | xargs -I {} bash -c 'cd "$(dirname {})" && go test ./...'
内容的提问来源于stack exchange,提问作者kyoshi
相关产品推荐
相关产品推荐

