コミット前にコードのLintとフォーマットを自動実行

Discourse は git フックに lefthook を使用しており、同じチェックを手動で実行するための主な CLI エントリポイントとして bin/lint を提供しています。

ローカルクローンで作業している場合は、フックを一度だけインストールしてください:

pnpm install
pnpm lefthook install

これ以降、ステージされたファイルは git commit 時に自動的にチェックされます。

主なコマンド: bin/lint

pre-commit フックを待つのではなく、リポジトリに設定されたリンターを自分で実行したい場合は bin/lint を使用してください。

一般的な使用例:

bin/lint
bin/lint path/to/file.rb path/to/file.gjs
bin/lint --recent
bin/lint --staged
bin/lint --unstaged
bin/lint --wip
bin/lint --fix path/to/file.rb
bin/lint --fix --recent
bin/lint --fix

各モードの機能

  • bin/lint: リポジトリ内のすべてのサポート対象ファイルをリンティング
  • bin/lint path/to/file ...: 指定されたファイルのみをリンティング
  • bin/lint --recent: 直近 50 コミットで変更されたファイルと、未追跡のファイルをリンティング
  • bin/lint --staged: ステージされたファイルのみをリンティング
  • bin/lint --unstaged: ステージされていないファイルのみをリンティング
  • bin/lint --wip: ステージされたファイル、ステージされていないファイル、および main 以降に変更されたファイルをリンティング
  • bin/lint --fix ...: 選択されたファイルに対して自動修正ツールを実行
  • bin/lint --fix: リポジトリ全体で利用可能なすべての自動修正ツールを実行
  • bin/lint --verbose: 基盤となる lefthook コマンドを表示

明示的にファイルを渡した場合、bin/lint は lefthook を呼び出す前に、それらをサポートされるリンティング可能なファイルタイプにフィルタリングします。

:information_source: Markdown のドキュメントファイルは現在 bin/lint の対象外であるため、bin/lint path/to/doc.md を実行しても、リンティング対象のファイルが見つからないと報告されます。

リンティング対象

正確な設定は lefthook.yml に記載されています。執筆時点で、bin/lint は以下をカバーしています:

Ruby

  • **/*.{rb,rake,thor}
  • bin/**/* 配下の Ruby スクリプト
  • Gemfile

チェック内容:

  • rubocop
  • syntax_tree (stree check)

JavaScript、GJS、CSS、および SCSS のフォーマット

  • app/assets/stylesheets/**/*.{css,scss}
  • frontend/**/*.{js,gjs,scss,css,cjs,mjs}
  • 該当するプラグインおよびテーマのアセットファイル

チェック内容:

  • prettier/pprettier

JavaScript および GJS のリンティング

  • frontend/**/*.{js,gjs}
  • 該当するプラグインおよびテーマの JS ファイル

チェック内容:

  • eslint (eslint-plugin-embertemplate-* ルールにより、.gjs ファイルのテンプレート部分をカバー)

SCSS のリンティング

  • app/assets/stylesheets/**/*.scss
  • 該当するプラグインおよびテーマの SCSS ファイル

チェック内容:

  • stylelint

YAML およびロケールチェック

  • config/database.yml を除く **/*.{yaml,yml}
  • **/{client,server}.en.yml

チェック内容:

  • yaml-lint
  • script/i18n_lint.rb

型チェック

ファイル引数なしで bin/lint を実行すると、リポジトリ全体のリンティングとして以下も実行されます:

  • pnpm lint:types

これは、Discourse の JavaScript 型情報に対する Glint/TypeScript スタイルのチェックです。

:information_source: bin/lint path/to/file や pre-commit フックは、完全な型チェックを実行しません。リポジトリ全体の完全なリンティングパスを実行したい場合は、単に bin/lint を使用してください。

自動修正可能な項目

bin/lint --fix は多くの問題を自動修正できますが、すべてではありません。

自動修正は以下に対して設定されています:

  • prettier --write
  • eslint --fix
  • stylelint --fix
  • rubocop -A
  • syntax_tree (stree write)

実際には、--fix によって以下が再フォーマットおよび書き換えられます:

  • Ruby
  • JavaScript / GJS
  • CSS / SCSS

これらのチェックは bin/lint --fix によって自動修正されません

  • YAML 構文の検証
  • client.en.yml / server.en.yml に対する i18n リンティング
  • Glint/型チェック

git フックとの関係

pre-commit フックは bin/lint と同じ lefthook 設定を使用しますが、ステージされたファイルに対してのみ実行されます。

つまり:

  • ステージされたファイルがリンティングに合格しないため、コミットが失敗する可能性があります
  • bin/lint --staged は pre-commit フックに最も近い手動の同等コマンドです
  • bin/lint --fix --staged は、コミットしようとしているものを正確に修復する良い方法です

実用的なワークフロー

日常的な開発において、最も有用なコマンドは以下の通りです:

# 変更された数個のファイルをコミットする前に
bin/lint --fix path/to/file1.rb path/to/file2.gjs

# pre-commit フックがチェックするものと全く同じものを確認
bin/lint --staged

# 現在の進行中のすべての作業をクリーンアップ
bin/lint --fix --wip

# 型チェックを含むリポジトリ全体のリンティングスイートを実行
bin/lint

このドキュメントはバージョン管理されています - 変更の提案は github で行ってください。

「いいね!」 11

7件の投稿が新しいトピックに分割されました: Discourseでのリンティングのデバッグ