Golang从1.19.x升级到1.20.x需要注意哪些问题
Golang从1.19.x升级到1.20.x需要注意哪些问题 我从 1.19.4 升级到 1.20.2,虽然构建过程顺利通过,但在运行测试时遇到了问题…
在某些情况下运行 go test ./... 时,我收到了错误信息:
go build github.com/influxdata/flux/libflux/go/libflux:
# pkg-config --cflags – flux
pkg-config: exec: "pkg-config": executable file not found in $PATH
而且我是在 Windows 系统上运行的…
实际上,我在 Linux 和 Mac 上也尝试过,得到了几乎相同的错误。
有什么想法吗?
更多关于Golang从1.19.x升级到1.20.x需要注意哪些问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html
我认为我认出了这种错误类型。我的想法是,某些代码(或许是 flux 包?)在 init() 函数中设置了命令行标志,从而劫持了测试的标志处理。
func main() {
fmt.Println("hello world")
}
更多关于Golang从1.19.x升级到1.20.x需要注意哪些问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
嗨,
我当然回滚了,go test 像之前一样正常工作了。
最有趣的是,在版本 1.20.2 上,“go build” 运行正常,只有 “go test” 失败了。
感谢你的建议。
christophberger:
pkg-config
我明白了,感谢你的回答。 问题是,在 1.19.7 版本中并不需要它… 而在我看来,这有点像是一种退步… 因为我不认为为了测试就需要安装 pkg-config… 你怎么看?
附注: 我是在 Windows 上工作的… 那我为什么需要 pkg-config?
我同意,这确实是一种奇怪的行为。
我尝试复现这个错误,但在我这边,go test 虽然经常失败,但并没有出现任何提及 pkg-config 的错误信息。(在 macOS 上)
即使是 go build 也没有像描述的那样工作。恐怕我无法对此进行更深入的探究。
也许你可以通过运行 go test -v ./... 来找到一些有用的输出信息。
func main() {
fmt.Println("hello world")
}
你好 @Kobi_Gana,
Flux 的 README 文件建议安装 pkg-config 和一个“pkg-config 包装器”。在我看来,关于安装包装器的说明已经过时了。“go get”命令现在只下载代码,但不会编译和安装二进制文件。
请尝试改用 go install 命令:
go install github.com/influxdata/pkg-config@latest
然后使用 which -a pkg-config 命令来验证包装器是否在真正的 pkg-config 二进制文件之前被找到。
我明白你的意思。我不确定具体是什么发生了变化。
无论如何,错误信息很明确:go test 在 $PATH 中找不到二进制文件 pkg-config(或者更准确地说,是它的包装器)。因此,第一步应该是确保二进制文件和包装器都已安装。
有个疑问:你试过回退到 Go 1.19 并重复测试吗?我想知道问题是出在 Go 本身,还是出在两周前发布的最新 flux 版本上。
另外,在 flux 仓库中有一个有趣的细节:
- 错误信息出现在执行
go build github.com/influxdata/flux/libflux/go/libflux时。 - flux 项目在两周前修复了 libflux 内部的路径处理。
很可能这个修复破坏了 Windows 上的路径处理。
目前我没有更好的解释。如果二进制文件和包装器都已正确安装,但错误仍然存在,我建议联系 flux 团队;他们更有能力追踪这个错误的根源。
从 Go 1.19.x 升级到 1.20.x 时,构建工具链和模块管理有一些变化。你遇到的 pkg-config 错误通常与 CGO 和外部库依赖有关,尤其是在跨平台构建时。
Go 1.20 对 CGO 的处理和构建缓存行为做了调整。错误信息显示系统缺少 pkg-config 工具,而你的项目(或间接依赖的 libflux)可能通过 CGO 依赖了某些 C 库。在 Go 1.20 中,构建过程可能更严格地要求这些工具在 $PATH 中可用,即使你之前版本没有遇到此问题。
首先,确保 pkg-config 已安装并可在 $PATH 中访问。在 Windows 上,你可以通过 MSYS2、Cygwin 或 vcpkg 安装它。例如,使用 Chocolatey:
choco install pkgconfiglite
在 Linux(如 Ubuntu/Debian)上:
sudo apt-get install pkg-config
在 macOS 上:
brew install pkg-config
如果 pkg-config 已安装但错误仍然存在,可能是构建环境问题。Go 1.20 引入了更严格的构建环境隔离。尝试清理构建缓存并禁用 CGO(如果你的项目不依赖 C 库):
go clean -cache
go test -cgo=0 ./...
如果必须使用 CGO,请确保环境变量设置正确。在 Windows 上,检查 %PATH% 是否包含 pkg-config 的路径。你可以通过脚本临时设置:
# 在 Windows PowerShell 中,假设 pkg-config 安装在 C:\msys64\usr\bin
$env:Path += ";C:\msys64\usr\bin"
go test ./...
另外,Go 1.20 改进了 go test 对测试二进制文件的构建方式。如果问题与特定包相关,尝试单独测试该包以隔离问题:
go test -x github.com/influxdata/flux/libflux/go/libflux
-x 标志会打印执行命令,帮助你查看 pkg-config 是如何被调用的。
如果上述方法无效,检查项目是否使用了 //go:build 标签或构建约束,这些可能在 Go 1.20 中行为有变。例如,确保 CGO 文件正确标记:
//go:build cgo
// +build cgo
package libflux
最后,验证你的 go.mod 文件是否与 Go 1.20 兼容。升级 Go 版本后,运行 go mod tidy 和 go mod verify 来确保依赖项一致:
go mod tidy
go mod verify
如果问题依旧,考虑在项目根目录创建一个 build_windows.go(或其他平台文件)来显式处理 CGO 依赖,但这通常作为最后的手段。示例:
// build_windows.go
//go:build windows && cgo
package main
/*
#cgo pkg-config: flux
*/
import "C"
总之,优先安装 pkg-config 并确保它在 $PATH 中,然后清理缓存并验证构建环境。Go 1.20 本身没有破坏性变化,但工具链的调整可能暴露了环境配置问题。

