Golang二进制包导致vet配置未找到错误
Golang二进制包导致vet配置未找到错误 Go版本为1.11 为了实现二进制代码共享,我使用了仅二进制包,如下所示:
tcnksm/go-binary-only-package
Go1.7仅二进制包示例。通过在GitHub上创建账户为tcnksm/go-binary-only-package开发做贡献。
此后,二进制文件(.a文件)可以成功共享到另一个项目B,go build运行正常并能获得输出。但是,如果我为项目B运行go test,它会以代码1退出。错误提示是“vet config not found”。经调查,go test会自动执行go vet,我不确定为什么go vet会返回退出代码1。
如果我使用-vet=off标志,go test会跳过go vet检查,一切正常,但我不想跳过它。
更多关于Golang二进制包导致vet配置未找到错误的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于Golang二进制包导致vet配置未找到错误的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Go 1.11中,当使用仅二进制包(binary-only package)时,go test 命令默认会运行 go vet 进行静态分析检查。由于仅二进制包缺少源代码文件(仅提供 .a 编译后的归档文件),go vet 无法找到相关的配置或源文件来执行分析,导致 “vet config not found” 错误并退出代码1。这是因为 go vet 依赖于包的源代码来检查潜在问题,而仅二进制包不包含这些源文件。
在Go 1.11中,仅二进制包通过在包目录中添加一个 //go:binary-only-package 注释来声明,但这不提供完整的元数据供 go vet 使用。因此,当 go test 调用 go vet 时,它会尝试读取包的配置(如 go vet 需要的分析规则),但由于源文件缺失而失败。
示例代码说明:假设你有一个仅二进制包 mylib,其目录结构如下(在项目B中):
projectB/
main.go
vendor/mylib/
mylib.a
mylib.go // 仅包含二进制包声明,无实际代码
在 mylib.go 中,你可能只有:
//go:binary-only-package
package mylib
当在项目B中运行 go test 时,如果测试涉及 mylib,go vet 会尝试分析它,但因缺少完整源文件而失败。
解决方法是显式禁用 go vet 或确保仅二进制包提供必要的元数据。但由于Go 1.11的限制,推荐使用 -vet=off 标志来避免此问题,或者考虑升级到更高版本的Go(如Go 1.12+,其中仅二进制包的支持有所改进,但注意Go 1.14后已弃用该特性)。如果必须保留Go 1.11和仅二进制包,可以修改测试命令:
go test -vet=off ./...
这不会跳过测试本身,仅跳过 go vet 检查。如果坚持不跳过 go vet,你可能需要提供完整的源代码包,而不是仅二进制包,因为 go vet 的设计依赖于源代码分析。
总之,在Go 1.11中,这是仅二进制包的一个已知限制,使用 -vet=off 是可行的变通方案。

