在 Go 中,当你遇到 “build constraints exclude all Go files” 错误时,意味着在某个包中没有符合当前构建条件的文件。
项目中遇到一个服务需要调用 Cplus 开发的库函数实现某些功能,但是仅提供了 Windows 和 Linux 两个平台,导致我们无法在 Darwin 环境运行该服务,算是业务驱动我去更精细化的了解技术了。
我期望的条件编译规则如下:
- Linux 和 Windows 编译包含库函数的代码;
- Darwin 不编译;
- 可以选择是否调用库函数;
规则 1, 2 可以使用平台条件编译实现:
// 规则一触发
//go:build !darwin
// 规则二触发
//go:build darwin
规则 3 需要依赖与 -tags 配置进一步控制编译结果
// 符合规则 1, 2 且允许规则 3 时编译
//go:build !darwin && tag01
// 符合规则 2 或不满足规则 3
//go:build darwin || !tag
这样配置已经没有问题了,但是仍然提示 “build constraints exclude all Go files” 错误?
我们可以使用 go list
命令来查看哪些文件被包括在内以及哪些被排除:
go list -tags ${TAG_NAME} -json ${PACKAGE_NAME}
示例输出如下:
{
"Dir": "",
"ImportPath": "",
"Name": "bitanswer",
"Files": [],
"GoFiles": [],
"IgnoredGoFiles": [
"file1.go",
"file2.go"
],
"GoFilesExclude": [
"file1.go",
"file2.go"
]
}
golang 文件夹命名也有条件编译的功能,当文件夹命名符合 filename_os 时,文件中的 //go:build
规则会失效。