Go 静态代码分析工具 golangci-lint | 青训营笔记

899 阅读1分钟

这是我参与「第五届青训营」笔记创作活动的第 13 天

golangci-lint简介

golangci-lint 是一个集成工具,它集成了很多静态代码分析工具,便于我们使用。有以下特点:

  • 速度非常快:golangci-lint 是基于 gometalinter 开发的,但是平均速度要比 gometalinter 快 5 倍。速度快的原因有三个:可以并行检查代码;可以复用 go build 缓存;会缓存分析结果。
  • 可配置:支持 YAML 格式的配置文件,让检查更灵活,更可控。
  • IDE 集成:可以集成进多个主流的 IDE,例如 VS Code、GNU Emacs、Sublime Text、Goland 等。
  • linter 聚合器:1.41.1 版本集成了 76 个 linter,并且还支持自定义 linter。
  • 最小的误报数:调整了所集成 linter 的默认设置,大幅度减少了误报。
  • 良好的输出:输出的结果带有颜色、代码行号和 linter 标识,易于查看和定位。 当前更新迭代速度很快,不断有新的 linter 被集成。

安装

如果要使用 golangci-lint,首先需要安装。因为 golangci-lint 本身就是 Go 语言编写的,所以我们可以从源代码安装它,打开终端,输入如下命令即可安装。

go get github.com/golangci/golangci-lint/cmd/golangci-lint@v1.35.2

使用这一命令安装的是 v1.35.2 版本的 golangci-lint,

如不能成功安装,则使用下面命令:

# binary will be $(go env GOPATH)/bin/golangci-lint
$ curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.35.2
golangci/golangci-lint info checking GitHub for tag 'v1.35.2'
golangci/golangci-lint info found version: 1.35.2 for v1.35.2/linux/amd64
golangci/golangci-lint info installed /home/wohu/gocode/bin/golangci-lint

或者参考:blog.csdn.net/txl910514/a…

如果还是安装失败,采用以下方法,下载源码,执行安装脚本

cd $GOPATH/src/github.com
git clone https://github.com/golangci/golangci-lint.git
cd golangci-lint/
chmod +x install.sh
sh install.sh -b $(go env GOPATH)/bin v1.38.0

2. 支持命令和全局选项

可以通过执行 golangci-lint -h 查看其用法,golangci-lint 支持的子命令见下表
usage
此外,golangci-lint 还支持一些全局选项。全局选项是指适用于所有子命令的选项,golangci-lint 支持的全局选项如下:
global

集成到 CI

代码检查一定要集成到 CI 流程中,效果才会更好,这样开发者提交代码的时候,CI 就会自动检查代码,及时发现问题并进行修正。

不管你是使用 Jenkins,还是 Gitlab CI,或者 Github Action,都可以通过 Makefile 的方式运行 golangci-lint 。现在我在项目根目录下创建一个 Makefile 文件,并添加如下代码:

getdeps:
   @mkdir -p ${GOPATH}/bin
   @which golangci-lint 1>/dev/null || (echo "Installing golangci-lint" && go get github.com/golangci/golangci-lint/cmd/golangci-lint@v1.32.2)
lint:
   @echo "Running $@ check"
   @GO111MODULE=on ${GOPATH}/bin/golangci-lint cache clean
   @GO111MODULE=on ${GOPATH}/bin/golangci-lint run --timeout=5m --config ./.golangci.yml
verifiers: getdeps lint