SideCI Blog

自動コードレビューサービスSideCIを提供している株式会社アクトキャットのコーポレートブログです。



Go言語用のあらゆるLinterを丸っと並列実行する、gometalinterを使いこなそう

多くのプログラミング言語でもそのコードの静的解析を行い警告を出すツール、いわゆるLinterが存在します。特に最近出てきたプログラミング言語ではLinterがよく作られているようです。Linterがあることによって、良いコードの書き方がLinterのソースコードに蓄積され、それを使うことで、より良く開発を進めていく事が出来るでしょう。

Go言語でも同じく、Linterが存在しています。ただし、他の言語と違って、非常に多くのLinterが目的に応じて存在しています。PythonやRuby、PHPなどの言語では主要なLinterは10以下程度ですが、Go言語ではこの記事執筆時点で20以上のLinterが存在しています。それらを一つ一つ使ってチェックしていたら時間がかかってしまうでしょう。そこでそれらのLinterを並列して丸っと実行し、結果を正規化・見やすいようにまとめてくれる、gometalinterを紹介します。

gometalinterのインストール

gometalinterは go コマンドを使ってインストールできます。

go get -u github.com/alecthomas/gometalinter

gometalinter自体はLint機能は持っていませんので、外部のLintツールをインストールする必要があります。 --install オプションでまとめてインストールできます。

$ gometalinter --install
Installing:
  interfacer
    :
  misspell

これでセットアップが完了です。対応しているツールは以下の通りです。

以下のLinterはデフォルトで無効になっていますので、使う場合には --enable オプションで指定する必要があります。

gometalinterの使い方

使い方は簡単で、任意のGoプロジェクトのディレクトリまたはファイルを指定して gometalinter コマンドを実行するだけです。そうすると、どのファイルのどの場所でどんな指摘があったかが出力されます。その際、Lintツール名も表示されます。

$ gometalinter .
options.go:21:1:warning: ALL is unused (deadcode)
datastore.go:19:6:warning: don't use underscores in Go names; type memberinfo_st should be memberinfoSt (golint)
main.go:25:7:warning: don't use underscores in Go names; const sw_version should be swVersion (golint)
tagsparser.go:142:6:warning: don't use underscores in Go names; func datatype_supported should be datatypeSupported (golint)
dotmaker.go:46:8:warning: should omit comparison to bool constant, can be simplified to opt_blackbox (S1002) (gosimple)

後はこの内容に沿って修正していけば良いだけです。

オプションについて

主なオプションを紹介します。まず解析対象から外す場合は --exclude オプションを指定します。

$ gometalinter --exclude options.go .

Linterが多数使われるので、 --sort オプションで並べ替えが指定できます。指定できるのは path/line/column/severity/message/linterとなっています。

$ gometalinter --sort=linter .

出力フォーマットを変える場合は --checkstyle または --json で指定します。それぞれ CheckStyleフォーマット、JSONフォーマットで出力します。

設定ファイルについて

gometalinterも他のLintツール同様に設定ファイルで動作を変えられます。デフォルトで config.go というファイルになります。例えば以下のよう記述します。見ての通りですが、まずすべてのLinterを無効にして、その後使うLinterを指定します。

{
  "DisableAll": true,
  "Enable": ["deadcode", "unconvert"]
}

gometalinterを使えば多数あるLintツールを一まとめにして管理できます。ツールごとにコンセプトが違いますので指摘事項も異なります。すべてのツールをクリアすれば良いという訳ではありませんが、多くのツールを通過できるコードはそれだけ品質の高いコードになっていることでしょう。

SideCIではgometalinterをサポートしています。チーム内でGoプロジェクトを採用しているのであればぜひご利用ください。無料トライアルも提供していますので、まずはお試しを