Go静态代码检查工具GolangCI-Lint
GolangCI-Lint
是一个lint聚合器,它的速度很快,平均速度是gometalinter
的5倍。它易于集成和使用,具有良好的输出并且具有最小数量的误报。而且它还支持go modules
。最重要的是免费开源。
下面公司或者产品都使用了golangci-lint
,例如:Google、Facebook、Red Hat OpenShift、Yahoo、IBM、Xiaomi、Samsung、Arduino、Eclipse Foundation、WooCart、Percona、Serverless、ScyllaDB、NixOS、The New York Times
和Istio
。
安装
CI安装
大多数安装都是为CI(continuous integration)准备的,强烈推荐安装固定版本的golangci-lint
。
// 二进制文件将会被安装在$(go env GOPATH)/bin/golangci-lint目录
curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b $(go env GOPATH)/bin vX.Y.Z
// 或者安装它到./bin/目录
curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s vX.Y.Z
// 在alpine Linux中,curl不是自带的,你需要使用下面命令
wget -O - -q https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s vX.Y.Z
上述命令执行完成后,你可以使用golangci-lint --version
来查看它的版本。
本地安装
建议不要对CI管道进行本地安装,仅在本地开发环境中以这种方式安装linter。
Windows,MacOS和Linux上,用命令:go get -u github.com/golangci/golangci-lint/cmd/golangci-lint
。当你的Go版本不低于1.11时,你可以获取golangci-lint的指定版本。例如:
GO111MODULE=on go get -u github.com/golangci/golangci-lint/cmd/[email protected]
在MacOS上面,你还可以使用brew
进行安装。
brew install golangci/tap/golangci-lint
brew upgrade golangci/tap/golangci-lint
本地安装完成后,你使用golangci-lint --version
是看不到它的版本信息的。命令行会提示错误:Error:unknown flag: --version
。要想看到可以执行下面的命令。
cd $(go env GOPATH)/src/github.com/golangci/golangci-lint/cmd/golangci-lint
go install -ldflags "-X 'main.version=$(git describe --tags)' -X 'main.commit=$(git rev-parse --short HEAD)' -X 'main.date=$(date)'"
如果你的机器是Windows,你可以在Git Bash中运行上述命令。这时再使用golangci-lint --version
就会看到类似的信息:
golangci-lint has version v1.16.0-11-g692dacb built from 692dacb on 2019年04月28日 14:30:25
使用
golangci-lint run [目录]/[文件名]
,例如检测下面的go文件。
package main
import (
"fmt"
"unsafe"
)
type Book struct {
Age int
Title string
}
func main() {
b := Book{}
fmt.Println("book size:", unsafe.Sizeof(b))
}
执行命令golangci-lint run main.go,可以在命令行看到下面提示:
main.go:14:2: SA4006: this value of `b` is never used (staticcheck)
b := Book{}
^
支持的linter
可以通过命令golangci-lint help linters
查看它支持的linters。你可以传入参数-E/--enable
来使某个linter
可用,也可以使用-D/--disable
参数来使某个linter
不可用。例如:
golangci-lint run --disable-all -E errcheck
参考文章