Go 学习笔记(73)— Go 静态代码分析工具 golangci-lint

可用于 Go 语言代码分析的工具有很多,比如 golintgofmtmisspell 等,如果一一引用配置,就会比较烦琐,所以通常我们不会单独地使用它们,而是使用 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 的配置比较灵活,比如你可以自定义要启用哪些 lintergolangci-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

猜你喜欢

转载自blog.csdn.net/wohu1104/article/details/113751501
go