LoginSignup
2
0

More than 1 year has passed since last update.

rubocopの備忘録②~reviewdogをlocalで~

Posted at

はじめに

https://qiita.com/kajiyai/items/952593849db0e21a9909の続きです。

reviewdogとrubocopで任意のブランチ間での差分にのみ修正をかけられる環境をローカルに作るつもりです。

先日、業務で部分改修を行いました。改修が終わり、rubocopにかけるとそのファイルの他のメソッド(私の修正箇所の他の部分)が軒並み注意を吐かれる、という事がありました。

自動修正コマンドを叩いて全部直せよ、という指摘はごもっともですが、本来のPRの趣旨と外れた修正が大量に生み出されてしまいます。やるなら別でタスクを切り出すのでしょうかね。

このような状況のため、現在私はrubocopコマンドを打ち、手動で一つ一つ直しています。この時間の無駄を倒す、というのがモチベーションです。

参考にした記事 https://zenn.dev/o_ku/articles/1c5b6f1c9eac9a

キーワード

rubocop, reviewdog

目次

  1. reviewdogとは
  2. 使ってみる
  3. まとめ
  4. 参考

reviewdogとは

reviewdog provides a way to post review comments to code hosting service, such as GitHub, automatically by integrating with any linter tools with ease. It uses an output of lint tools and posts them as a comment if findings are in diff of patches to review. reviewdog also supports run in the local environment to filter an output of lint tools by diff.

githubでレビューコメントを自動で投稿するツールで、lintツールと連携して差分にのみコメントしてくれる奴です。

ローカルでの実行もサポートしてるよ、とのこと。

使ってみる

要件定義

参考記事をまねて要件定義をしてみました

  • 変更があったファイルのみrubocopを実行する
  • 自分が変更した部分のみ怒られるようにする

pre-commitについて調べていたらこんな記事を見つけました

https://nazo.hatenablog.com/entry/dont-use-pre-commit-hook

今回の記事の趣旨とは異なるため、要件からは外しました。

変更があったファイルのみrubocopを実行する

ぐぐりました

https://chocoby.com/blog/2021/02/16/git-rubocop-rspec-one-liner/

この記事のコマンドで実行できそう!と思いましたが、Linuxコマンドでした。いくつか調べるとwinのpowershellにはcatコマンドはないそうです。

私の環境では次のようなコマンドで実現できそうです。

$test=git status -s;$rubo=$test.substring(3);rubocop $rubo

test2.rbファイル、test2-1.rbファイルを作成し、上記のコマンドを実行してみました。

(複数ファイルがあっても変更を検知するか、というのを見たかったので)

image.png

警告が出ました。そしてこのまま二つのファイルともコミットします。

そして、git statusでツリーがクリーンになっている事を確認し、test2-1.rbファイルのみ変更します。具体的には、printの後ろに改行を追加するのみです。そして、先ほどのコマンドを実行します。

$test=git status -s;$rubo=$test.substring(3);rubocop $rubo

すると、test2-1.rbファイルだけが怒られました。

image.png

test2.rbファイルは出てきていません。

これで、変更があったファイルのみrubocopを実行する、を実現できたと言えそうです。

自分が変更した部分のみ怒られるようにする

reviewdogの出番です。reviewdogをローカルにインストールします

macの方はhomebrewとかでインストールしてください

僕はwinなのでscoopを使ってインストールしてみました。

下記コマンドを打ちます。

$ scoop install reviewdog

$ reviewdog --version

を打って、バージョンが表示されればインストール成功です。

さて、-diffにgit diffを指定して、reviewdogを実行します。

git status -s ではなく、git diff —name-onlyで同様の事が出来ました

https://www.k-hitorigoto.online/entry/2020/08/06/080000

下のコマンドを実行します。

$ rubocop $(git diff --name-only) | reviewdog -f=rubocop -diff="git diff" -fail-on-error -filter-mode="added"

~~いい感じで動いてますね(文字化けしとる…)

うーん、ファイルの中身が見えなくてもrubocopが言ってることが分かればいいかあ()

image.png

さて、これは先ほどと同じことを言われておりますが、一度このままコミットしてしまいましょう。そして、以下のメソッドを同じファイル(test2-1.rb)に追加します。

def hello
    puts 'hello world'
end

その後、下のコマンドを実行します(先ほどと同様)

$ rubocop $(git diff --name-only) | reviewdog -f=rubocop -diff="git diff" -fail-on-error -filter-mode="added"

image.png

先ほど同じファイルに出ていた警告は表示されず、今回追記したメソッドのみチェックし、警告を出すようにしてくれています。

ちなみに、rubocop のみ実行した場合たくさん表示されました。

image.png

さて、これで自分が変更した部分のみ怒られるようにするが実現できたと言えそうです。

まとめ

reviewdogをローカルで実行できるようになりました!

これまで手動で変更していた内容をコマンドで実行できるようになったので生産性がましになったはずです。

前の記事では.rubocop.ymlとか.rubocop-todo.ymlとかの設定をしてみたいと述べましたが今回は出来ませんでしたが、意外と手が動かず。いつかrubyのアプリを作り始める時にやってみようかと思います。

さて、今回は私のwinのローカルPCで動かしましたが、今時はDocker使わない場所はほぼないと思います。ですので、Dockerの勉強も兼ねてrailsとmysqlの環境構築をし、何かのアプリを作成していこうかなと思っています。

ではまた。

参考

2
0
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
2
0