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

## はじめに

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

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

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

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

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

参考にした記事 [https://zenn.dev/o_ku/articles/1c5b6f1c9eac9a](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](https://nazo.hatenablog.com/entry/dont-use-pre-commit-hook)

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

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

ぐぐりました

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

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

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

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

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092463/e71f50b7-b907-4285-9ff5-e1bc60912d72.png)

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

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

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092463/b54e2751-3c69-2f52-22cd-e5cc0edb0792.png)


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

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

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

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

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

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

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

```ruby
$ scoop install reviewdog
```

https://github.com/reviewdog/reviewdog

```ruby
$ reviewdog --version
```

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

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

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

[https://www.k-hitorigoto.online/entry/2020/08/06/080000](https://www.k-hitorigoto.online/entry/2020/08/06/080000)

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

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

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092463/b11ce3b7-e848-3847-aecf-2116bb9c720c.png)


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

```ruby
def hello
    puts 'hello world'
end
```

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

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

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092463/afab1ac6-2c59-d3e5-b2ae-5e696f9b48d4.png)


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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092463/d62d9c1a-8271-c967-902f-1e6405cc6f1d.png)


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

## まとめ

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

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

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

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

ではまた。

## 参考

- [https://zenn.dev/o_ku/articles/1c5b6f1c9eac9a](https://zenn.dev/o_ku/articles/1c5b6f1c9eac9a)
- [https://nazo.hatenablog.com/entry/dont-use-pre-commit-hook](https://nazo.hatenablog.com/entry/dont-use-pre-commit-hook)
- [https://qiita.com/shibukk/items/8c9362a5bd399b9c56be](https://qiita.com/shibukk/items/8c9362a5bd399b9c56be)
- [https://qiita.com/masato930/items/f5908a2960af46e9b793](https://qiita.com/masato930/items/f5908a2960af46e9b793)