モノレポでprontoを使うと.rubocop.ymlに書いているexcludeが無視されてしまう

  • モノレポ
    • このように 1 つのリポジトリの中に複数のパッケージを同梱するリポジトリの運用方法は monorepo (モノレポ・モノリポ)と呼ばれています。
  • pronto
/tmp/root <= リポジトリルート
/tmp/root/rails_app: <= railsアプリ

上記のディレクトリレイアウトの時に、/tmp/root/rails_appに移動して、下記の内容を書いた.rubocop.ymlを使ってprontoを実行すると、db/schema.rbを検査対象からexcludeしてくれない、という問題である。

# ./rails_project/.rubocop.yml
AllCops:
  Exclude:
    - 'db/schema.rb'

なぜこれが起きているかというと、リポジトリ内のrailsアプリディレクトに移動しているにも関わらず、prontoがリポジトリルートにDir.chdir()した上で .rubocop.ymlをロードしているからだ。
そのような振る舞いによって、rubocopが設定ファイルから読みだしたexclude対象な絶対パスは/tmp/root/db/schema.rbになってしまう。しかし、コミットされた差分のあるファイルの絶対パスは /tmp/root/rails_app/db/schema.rbである。

rubocopの振る舞いのように、カレントディレクトを基準にパスを解釈するほうが正しいように思う。

修正プルリクを送ったけど今のところ返事がない。
https://github.com/prontolabs/pronto/pull/374

本件に関しては.rubocop.ymlを下記のように変更することでも回避は可能。

# ./rails_project/.rubocop.yml
AllCops:
  Exclude:
    - '**/db/schema.rb'

おわり