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

7 回复

我认为我认出了这种错误类型。我的想法是,某些代码(或许是 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 仓库中有一个有趣的细节:

很可能这个修复破坏了 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 tidygo 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 本身没有破坏性变化,但工具链的调整可能暴露了环境配置问题。

回到顶部