on
golangci-lintに入門してみる
Tags:
#Go本記事は東京学芸大学 櫨山研究室 Advent Calendar 2020の17日目の記事になります。
GoのLinterといえば長らくgolintがデファクト的な存在でしたが、つい半年ほど前にdeprecatedになりました。
代替のLinterはいくつかあるようですが、本記事では代替Linterの一つであるgolangci-lintのインストールから実行までを簡単にまとめてみました。
golangci-lint
golangci-lintは元々、GolangCIというCIサービス上で動作するように設計されたLinterです。現在ではGolangCI以外のCIサービスでも利用可能となっています。
golangci-lintはそれ自体がLinterツールであるというより、多数あるLinterをまとめて実行するためのツールとなっています。ドキュメントにもgolangci-lint is a Go linters aggregator.
という記述がありました。
インストール
ローカル環境でgolangci-lintを利用するには以下のようにしてツールのインストールが必要です。 Macのユーザーはbrew経由でインストールが可能です。
$ brew install golangci-lint
$ golangci-lint --version
golangci-lint has version 1.33.0 built from b90551c on 2020-11-23T06:54:06Z
Linux、Windowsのユーザーは以下のコマンドからインストールすることが可能です。
$ curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.33.0
$ golangci-lint --version
golangci-lintの実行方法
goのリポジトリ内で以下のコマンドを実行します。
$ golangci-lint run
もしくは以下のコマンドでも実行可能です。
$ golangci-lint run ./...
デフォルトの状態では以下のlinterが有効になっています。
- deadcode
- errcheck
- gosimple
- govet
- ineffassign
- staticcheck
- structcheck
- typecheck
- unused
- varcheck
設定ファイル
golangci-lintは.golangci.yml
に細かいオプションを記述することが可能です。Lintのタイムアウト時間や、ignoreしたいディレクトリやファイル、Lintルールの追加や削除も可能です。
.golangci.yml
はプロジェクトルートに配置します。
VSCodeでのgolangci-lintの設定方法
VSCodeのsettings.jsonに以下を追加することでgolangci-lintが有効になります。
"go.lintTool":"golangci-lint",
"go.lintFlags": [
"--fast"
]
--fast
オプションを利用することで、複数のLinterでソースコードのASTを共有するようになります。
ワーニングのサプレス
ワーニングが出ている行に対して以下のようにコメントすることでサプレスすることが可能です。 下記の例ではerrcheckのワーニングをサプレスしています。
//nolint:errcheck
GitHub Actionsでの実行
公式から出ているカスタムGitHub Actionsがありますが、今回は利用せずに実行しました。
以下は今回検証したGitHub Actionsの設定ファイルです。
name: build
on: [push]
jobs:
build:
name: build
runs-on: ubuntu-latest
steps:
- uses: actions/setup-go@v2
with:
go-version: 1.15
- uses: actions/checkout@v2
- run: curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.33.0
- run: golangci-lint run
なお、公式のGitHub Actionsは以下にあります。
終わりに
簡単ですが、golangci-lintについて調べた結果をまとめてみました。 最後までお読みいただきありがとうございました!!