kdnakt blog

hello there.

VS CodeでGo言語のエラーハンドリング漏れを検知する設定をした話とか

またお便りが届きました!🎉

 

前回の続きで、今回はVS Codeでリンターの設定をします。

kdnakt.hatenablog.com

 

 

[おたより紹介]

今回は2人から来ました。

 

1通目

おなじみbudougumi先生から。

 

英語ちゃんと読めや!というお叱り。確かに……。

 

2通目

 mobcovさんからいただきました。

 

gometalinterじゃなくてgolangci-lintというのもあるらしい。ふむふむ。 

 

[settings.jsonでgo.lintToolを設定する]

早速設定を。VS Codeの設定は「.vscodeディレクトリを作り、さらにその中にsettings.jsonファイルを作る。

f:id:kidani_a:20190124093629p:plain

 

go.lintToolの設定をsettings.jsonに書く。多分このへんの作業は手作業じゃなくてもっといい感じにやる方法がありそうだけど、それは後日調べる。

f:id:kidani_a:20190124094005p:plain

[2019/01/27 追記]

またおたよりが。ありがたや……。

[2019/01/27 追記ここまで]

 

settings.jsonファイルに記載した内容をCtrl+Sで保存すると、ウィンドウの右下にダイアログが表示された。gometalinterがインストールされていないらしい。迷わずInstallボタンをクリック。

f:id:kidani_a:20190124094016p:plain

 

OUTPUTタブにgometalinterと依存ライブラリのインストール結果が表示される。

f:id:kidani_a:20190124094028p:plain

これで無事インストール完了。

 

[gometalinterが反応しない]

f:id:kidani_a:20190125071057p:plain

だが、待てど暮らせどリンターが反応してくれる気配がない。はて。

 

github.com

英語をよく読むと、「Lint-on-save」の文字が。あー、ファイルを保存し直せばいいのか。

というわけで、適当に改行を追加して保存してみると、無事エラーハンドリングが甘い!というワーニングが表示された。

f:id:kidani_a:20190124094103p:plain

 

[golangci-lintも使ってみる]

せっかくなので紹介いただいたもう一個のリンターも使ってみる。 

settings.jsonの内容を変更して保存する。

f:id:kidani_a:20190125071555p:plain


リンターがインストールされていなければ、先ほどと同様にgolangci-lintのインストールを促すダイアログが表示される。ここもInstallをクリック。

f:id:kidani_a:20190125071619p:plain

 

インストールが無事完了したところ。

f:id:kidani_a:20190125071716p:plain

 

改めてファイルに適当な変更を加えてリンターを動作させてみる。

f:id:kidani_a:20190125071817p:plain

無事動作確認も完了した。

 

[再度gometalinterをいじる]

golangci-lintはgometalinterより爆速だよ!とGithub上ではうたっているものの、対象ファイルが小さいからか、それほど速度の違いは感じなかった。

 

gometalinterの場合とgolangci-lintの場合とで、それぞれワーニングを表示しているリンターがgosecとerrcheckで異なっているのが気になった。多分、ワーニングの対象として緑の下線が引かれる部分が異なっているのも検知しているリンターが異なるのが影響しているのだろう。

 

gometalinterの場合もデフォルトでerrcheckはオンになっているようだったので、他のリンターをオフにしてerrcheckのみを動作させる下記の設定を試した。すると、gometalinterの場合でもerrcheckによるワーニングのメッセージを表示することができた。

f:id:kidani_a:20190125072350p:plain

 

緑色の下線でワーニングになっていて赤色下線のエラーじゃないのが気になって、go.lintFlagsにseverityの設定を試してみたが効果がなかった。Githubちゃんと読んだつもりなんだけどな……はて。

f:id:kidani_a:20190125072642p:plain

 

OUTPUTタブでリント時のコマンドを確認すると、/Users/akito/go/bin/gometalinter --disable-all --enable=errcheck --severity=errcheck:error --aggregateとなっていてオプションの設定自体は間違っていなそうなのだけれど。ちなみにseverityのソースをみるとLINTER:SEVERITYのように大文字になっていたからERRCHECK:ERRORという設定も試してみたが効果がなかった。

github.com

 

[まとめ]

先生方おたよりありがとうございます!

おかげで面倒なリントから解放されそうです。

 

……最初はsettings.jsonがうまく機能せず悩んでいたが、setting.jsonという命名にしてしまっていたのはナイショ。