LoginSignup
12
4

More than 3 years have passed since last update.

golangci-lintに自作linterを追加する

Last updated at Posted at 2020-07-07

はじめに

golangci-lintgolangci-lint run を実行するだけで、様々なlinterを実行することができます。

これには以下のメリットがあります。

  • 各linterの導入方法や設定方法を覚える必要なく、共通の設定で管理できる
  • 自分でlinterを探さなくても、良いlinterが日々追加されていく
  • 誤検出がある場合に、linterによらず共通の設定方法でその結果を無視することができる

この記事では、golangci-lintに自作linterを追加する方法を公式ドキュメントと実際にsonatardがPRを出したファイルを参考にして紹介します。
golangci/golangci-lint - Add Noctx #1179

他にも日本の方では timakinさん作のbodyclosenakabonneさん作のnestif がgolangci-lintに採用されています。

公開Linterをgolangci-lintに追加する

0. Linterを実装する

golangci-lintは go/analysis packageを利用していないLinterをマージしないので、必ず利用するようにしましょう。

golangci-lint公式が紹介しているWriting Useful go/analysis Lintertenntennさんが公開されている資料を参考に実装してみてください。

1. fork

https://github.com/golangci/golangci-lint を fork します。

2. テストの追加

Linterのためのテストを実装します。 test/testdata/{yourlintername}.go に テストのファイルを追加します。サンプル

そして T=yourlintername.go make test_linters を実行して、テストが失敗することを確認します。

3. Linterの追加

pkg/golinters/{yourlintername}.go という新しいファイルを追加します。 このディレクトリ内の他のLinterの実装を参考にしてください。 サンプル

pkg/golinters/{yourlintername}.go で実装したLinterの新しい構造体を pkg/lint/lintersdb/manager.goGetAllSupportedLinterConfigs 関数に追加します。 確実な場合のみデフォルトで有効にしてください。 サンプル私が作成した noctx はデフォルトではオフになっています。

T=yourlintername.go make test_linters でテストが通ることを確認します。

4. Linterのオプションの設定

Linterに設定する必要があるオプションを調べます。例えば、govetには check-shadowing 1つのオプションしかありません。golangci-lintのユーザーの迷惑にならないようにデフォルト値を選択します。 設定ファイルの例 .golangci.example.yml

golangci-lintプロジェクト向けのgolangci-lintの設定にデフォルト値以外を設定する必要があるのならば .golangci.ymlに追加します。

config struct - pflag が適切な設定ファイルを解析するためのmapstructureタグを忘れないでください。

5. PRを送る

プルリクエストを送ると、CIが走るのですべて通過することを確認します。
またbotによりCLAの同意が求められるので同意する必要があります。

最後にレビューとそのコメントの修正が完了するとマージされて終了になります。

まとめ

既にテストさえ書いていれば数ファイルを修正するだけで、PRを送ることができます。
自作Linterを作成しても中々使ってもらうことは難しいので「多くの開発者に自作のLinterを使ってもらうことでGoコミュニティをより良くしたい!」と考える方は、是非golangci-lintにPRを送ってみてください。

参考

12
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
4