前文:
golangci-lint --version
golangci-lint has version v1.52.2 built with go1.20.2 from (unknown, mod sum: "h1:FrPElUUI5rrHXg1mQ7KxI1MXPAw5lBVskiz7U7a8a1A=") on (unknown)
go version
go version go1.20.2 darwin/amd64
在一次更新代码后发现原有正常运行的golangci-lint 突然不好使了:
golangci-lint run xxx
WARN [runner] Can’t run linter goanalysis_metalinter: buildir: failed to load package : could not load export data: no export data for “github.com/ugorji/go/codec”
ERRO Running error: 1 error occurred:
* can’t run linter goanalysis_metalinter: buildir: failed to load package : could not load export data: no export data for “github.com/ugorji/go/codec”
其中 重点报错为:`Can’t run linter goanalysis_metalinter`, 查询官方issue发现两种解决方案 执行go mod tidy 或因为无法构建进程导致,但对应目录下go mod tidy 执行也没有错,由于当前目录是作为工具目录被其他所引用的,所以不包含main.go 没有构建函数,所以在ci 报错目录下执行下列build构建命令:
go build ./…
/Users/huaijiahui/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/binding/msgpack.go:14:2: ambiguous import: found package github.com/ugorji/go/codec in multiple modules:
github.com/ugorji/go v0.0.0-20171122102828-84cb69a8af83 (/Users/huaijiahui/go/pkg/mod/github.com/ugorji/go@v0.0.0-20171122102828-84cb69a8af83/codec)
github.com/ugorji/go/codec v1.2.11 (/Users/huaijiahui/go/pkg/mod/github.com/ugorji/go/codec@v1.2.11)
发现存在包依赖引用冲突,该问题查询issue又发现临时解决方案mod中添加replace github.com/ugorji/go => github.com/ugorji/go/codec v1.1.7,但是添加了该replace后,go build成功了,ci又报错了:ERRO Running error: context loading failed: no go files to analyze。百思不得其解,这里发现原来是gin版本里的codec包冲突问题,于是排查是由于一个测试包引用旧版本gin导致,这里去掉gin包后,构建恢复,ci也恢复正常。
golangci-lint 静态代码检测支持多种检查lint以及各种规则通过制定golangci yaml 并且结合github action 的方式来自动化检测代码,能够省去很大一部分精力,虽然由于很多规范修正起来很麻烦,但是对于检查代码质量十分有帮助,而且养成修改习惯后,逐渐会形成很好的代码风格。