💡

golangci-lintに新しいlinterを追加する方法

2022/12/23に公開

この記事はCyberAgent AI tech studio | Go Advent Calendar 2022 22日目の記事です。

golangci-lintに新しいlinterを追加したい

golangci-lintは様々なlinter ruleを搭載し、同時に設定したルールを実行することができるGoのツールとなっています。

https://golangci-lint.run/

golangci-lintは様々なlinterに直接依存することでgolangci-lintをinstallするだけで様々なlinterを使用することができるような設計になっています。

基本的な使い方やどのようなlinterが存在するかは golangci-lintを理解する (2021年の記事のためlinter ruleはもう少し増えています)をみていただくとわかると思います。

この記事では自身が新しく作成したlinterをgolangci-lintに追加したくなった際にどのように追加するかを解説しようと思います。golangci-lintの公式ページにもcontributionの方法は載っていますが日本語の1記事しかなかったため参入障壁を低くするためにも書いていこうと思います。

https://golangci-lint.run/contributing/new-linters/

新しいlinterを追加する

実装サンプルはこちらを参考にしてください。

まずgolangci-lintに新しく追加したいlinterはgo/analysisを用いて実装されている必要があります。これは雛形を自動で生成してくれる skeletonを用いて作成することをお勧めします。

次にgolangci-lintをforkします。その後test/testdata/作成したlinterの名前.goでファイルを作成し、テストを実装します

その後 T=作成したllinterの名前.go make test_lintersを実行しテストが失敗することを確認します。

あとは実際にlinterを追加していきます。まず pkg/golinters/作成したlinterの名前.goを作成します。この中では実際に追加したいlinterのstructを定義します。その後pkg/lint/lintersdb/manager.goGetAllSupportedLinterConfigsというfuncに定義したstructを追加します。このファイル内では他にもlinterをdefaultでONにするかどうかなども設定できますがよほど汎用的なルールでない限りはここはいじらなくて大丈夫です。

次はlinterのオプションの設定です。こちらはオプションを持たないlinterを追加する場合は気にしなくて大丈夫ですがオプションが存在する場合対応する必要があります。例えサンプルに載せたtenvではAllというオプションが存在するためオプションの対応をしています。
オプションは.golangci.reference.ymlに追加します。

ここまで実装が完了すれば再度 T=作成したlinterの名前.go make test_lintersでテストがPASSすることを確認します。
もしこの時にオプションで実行した場合のテストも行いたい場合は、test/testdata/configs/いい感じの名前.ymlを作成しテストファイルの上部に // config_path: testdata/configs/いい感じの名前.ymlと書くことでオプションを有効にしたテストも書くことが可能です。

最後にpushしてレビューが通れば晴れてgolangci-lintのlinterに仲間入りすることができます🎉
初めてのPRだとCLAのサインを求められると思いますので同意しましょう。

まとめ

最後までお読みいただきありがとうございました。もし他にわからないことがあればTwitterで質問お待ちしております!

Discussion