RuboCopと共存する
フォーマッターを
探した話

@hey_cube

I am へいきゅーぶ

  • @hey_cube
  • オプトテクノロジーズ
  • web エンジニア
    • TypeScript + React
    • Ruby on Rails

フロントエンド

+

バックエンド

バックエンド

+

?

フォーマッターが欲しい

  • コードに統一感が欲しい
  • ファイルを保存したときに自動でフォーマットして欲しい
  • どういうフォーマットが良いかはあまり議論したくない

Rufo

Rufo とは

  • "one true format" を提供してくれる Ruby フォーマッター
  • Prettier に近い思想を持っている
  • RuboCop と併用されるユースケースも想定してるっぽい

導入してみる

Gemfile

group :development do
  gem "rubocop-config-rufo", require: false
  gem "rufo", require: false
end

.rubocop.yml

inherit_gem:
  rubocop-config-rufo: rubocop.yml

.circleci/config.yml

- run:
    name: run rufo check
    command: bundle exec rufo --check app config db/seeds.rb db/seeds lib spec Gemfile Rakefile

コマンドが長いので

rake タスクにしちゃう

rufo.rake

# frozen_string_literal: true

require "bundler/setup"
require "rufo"

namespace :rufo do
  desc "Rufo に違反していないか確認する"
  task :check do
    Rufo::Command.run(["--check", "app", "config", "db/seeds.rb", "db/seeds", "lib", "spec", "Gemfile", "Rakefile"])
  end

  desc "Rufo に従って整形する"
  task :format do
    Rufo::Command.run(["app", "config", "db/seeds.rb", "db/seeds", "lib", "spec", "Gemfile", "Rakefile"])
  end
end

.circleci/config.yml

- run:
    name: run rufo check
    command: bundle exec rake rufo:check

.vscode/extensions.json

{
  "recommendations": [
    "rebornix.ruby",
    "misogi.ruby-rubocop",
    "mbessey.vscode-rufo"
  ],
  "unwantedRecommendations": []
}

.vscode/settings.json

{
  "ruby.lint": {
    "rubocop": true
  },
  "[ruby]": {
    "editor.defaultFormatter": "mbessey.vscode-rufo"
  }
}

良いところ

  • 自前でルールを書かなくて良い
  • 早い
  • Gemfile や Rakefile も整形してくれる

微妙なところ

  • rubocop-config-rufo の開発がそんなに活発じゃなさそう
  • オートフォーマットして欲しくないファイルがある場合はコマンドライン引数で頑張るしかない

参考 URL

細かい話は Qiita にて

良き Ruby ライフを!

RuboCopと共存するフォーマッターを探した話

By hey_cube

RuboCopと共存するフォーマッターを探した話

RuboCop を導入済みのプロダクトに Ruby 用フォーマッターである Rufo を導入するやり方とか / https://heiseirb.connpass.com/event/138210/

  • 1,732