コミット前に自動的にコードをリンティングおよびフォーマットする

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

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

pnpm install
pnpm lefthook install

その後、ステージングされたファイルは git commit 時に自動的にチェックされます。

主なコマンド:bin/lint

プリコミットフックを待たずに、リポジトリで設定されたリンターを手動で実行したい場合は 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.gjs ファイルのテンプレート部分をカバーする eslint-plugin-embertemplate-* ルールを含む)

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 とプリコミットフックは完全なタイプチェックを実行しません。リポジトリ全体の完全なリンティングを実行したい場合は、通常の 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 フックとの関係

プリコミットフックは bin/lint と同じ lefthook 設定を使用しますが、ステージングされたファイルのみに対して実行されます。

つまり:

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

実用的なワークフロー

日々の開発において、最も便利なコマンドは以下の通りです。

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

# プリコミットフックがチェックするものを正確に確認
bin/lint --staged

# 現在の進行中の作業をすべて整理
bin/lint --fix --wip

# タイプチェックを含むフルリポジトリのリンティングスイートを実行
bin/lint

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

「いいね!」 11

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