可用于 Go
语言代码分析的工具有很多,比如 golint
、gofmt
、misspell
等,如果一一引用配置,就会比较烦琐,所以通常我们不会单独地使用它们,而是使用 golangci-lint
。
官网地址: https://github.com/golangci/golangci-lint
golangci-lint
是一个集成工具,它集成了很多静态代码分析工具,便于我们使用。通过配置这一工具,我们可以很灵活地启用需要的代码规范检查。
1. 安装
如果要使用 golangci-lint
,首先需要安装。因为 golangci-lint
本身就是 Go
语言编写的,所以我们可以从源代码安装它,打开终端,输入如下命令即可安装。
go get github.com/golangci/golangci-lint/cmd/[email protected]
使用这一命令安装的是 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
不能成功安装请参考
https://blog.csdn.net/txl910514/article/details/105880125
wohu@ubuntu:~$ 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
wohuh@ubuntu:~$ ls go
如果还是安装失败,采用以下方法,下载源码,执行安装脚本
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
安装完成后,在终端输入如下命令,检测是否安装成功。
golangci-lint --version
golangci-lint has version 1.35.2 built from 1da5701 on 2021-01-11T02:54:03Z
2. 运行
安装成功 golangci-lint
后,就可以使用它进行代码检查了,示例代码
package main
import "os"
const name string = "wohu"
func main() {
os.Mkdir("demo_test", 0755)
}
运行命令:
wohu@ubuntu:~/gocode/src$ golangci-lint run demo.go
demo.go:5:7: `name` is unused (deadcode)
const name string = "wohu"
^
demo.go:7:13: Error return value of `os.Mkdir` is not checked (errcheck)
os.Mkdir("demo_test", 0755)
^
通过代码检测结果可以看到,两个代码规范问题都被检测出来了。检测出问题后,你就可以修复它们,让代码更加符合规范。
3. 配置
golangci-lint
的配置比较灵活,比如你可以自定义要启用哪些 linter
。golangci-lint
默认启用的 linter
,包括这些:
- deadcode - 死代码检查
- errcheck - 返回错误是否使用检查
- gosimple - 检查代码是否可以简化
- govet - 代码可疑检查,比如格式化字符串和类型不一致
- ineffassign - 检查是否有未使用的代码
- staticcheck - 静态分析检查
- structcheck - 查找未使用的结构体字段
- typecheck - 类型检查
- unused - 未使用代码检查
- varcheck - 未使用的全局变量和常量检查
小提示:
golangci-lint
支持的更多linter
,可以在终端中输入golangci-lint linters
命令查看,并且可以看到每个linter
的说明。
如果要修改默认启用的 linter
,就需要对 golangci-lint
进行配置。即在项目根目录下新建一个名字为 .golangci.yml
的文件,这就是 golangci-lint
的配置文件。在运行代码规范检查的时候,golangci-lint
会自动使用它。假设我只启用 unused
检查,可以这样配置:
.golangci.yml
linters:
disable-all: true
enable:
- unused
在团队多人协作开发中,有一个固定的 golangci-lint
版本是非常重要的,这样大家就可以基于同样的标准检查代码。要配置 golangci-lint
使用的版本也比较简单,在配置文件中添加如下代码即可:
service:
golangci-lint-version: 1.32.2 # use the fixed version to not introduce new linters unexpectedly
此外,你还可以针对每个启用的 linter
进行配置,比如要设置拼写检测的语言为 US
,可以使用如下代码设置:
linters-settings:
misspell:
locale: US
golangci-lint
的配置比较多,你自己可以灵活配置。关于 golangci-lint
的更多配置可以参考官方文档,这里我给出一个常用的配置,代码如下:
配置文件 .golangci.yml
linters-settings:
golint:
min-confidence: 0
misspell:
locale: US
linters:
disable-all: true
enable:
- typecheck
- goimports
- misspell
- govet
- golint
- ineffassign
- gosimple
- deadcode
- structcheck
- unused
- errcheck
service:
golangci-lint-version: 1.32.2 # use the fixed version to not introduce new linters unexpectedly
4. 集成到 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/[email protected])
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