はじめに
golangci-lintはgolangci-lint run
を実行するだけで、様々なlinterを実行することができます。
これには以下のメリットがあります。
- 各linterの導入方法や設定方法を覚える必要なく、共通の設定で管理できる
- 自分でlinterを探さなくても、良いlinterが日々追加されていく
- 誤検出がある場合に、linterによらず共通の設定方法でその結果を無視することができる
この記事では、golangci-lintに自作linterを追加する方法を公式ドキュメントと実際にsonatardがPRを出したファイルを参考にして紹介します。
golangci/golangci-lint - Add Noctx #1179
他にも日本の方では timakinさん作のbodyclose、nakabonneさん作のnestif がgolangci-lintに採用されています。
公開Linterをgolangci-lintに追加する
0. Linterを実装する
golangci-lintは go/analysis packageを利用していないLinterをマージしないので、必ず利用するようにしましょう。
golangci-lint公式が紹介しているWriting Useful go/analysis Linterやtenntennさんが公開されている資料を参考に実装してみてください。
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.go
の GetAllSupportedLinterConfigs
関数に追加します。 確実な場合のみデフォルトで有効にしてください。 サンプル私が作成した 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を送ってみてください。