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が有効になっています。

設定ファイル

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について調べた結果をまとめてみました。 最後までお読みいただきありがとうございました!!

See Also