コミット前にコードを自動的にリント・フォーマットする

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

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

pnpm install
pnpm lefthook install

その後、コミット時にステージされたファイルが自動的にチェックされます。

メインコマンド: 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: リポジトリ内のサポートされているすべてのファイルを lint する
  • bin/lint path/to/file ...: 指定されたファイルのみを lint する
  • bin/lint --recent: 過去 50 回のコミットで変更されたファイルと、追跡されていないファイルを lint する
  • bin/lint --staged: ステージされているファイルのみを lint する
  • bin/lint --unstaged: ステージされていないファイルのみを lint する
  • bin/lint --wip: ステージされているファイル、ステージされていないファイル、および main からの変更があったファイルを lint する
  • bin/lint --fix ...: 選択されたファイルに対して自動修正を実行する
  • bin/lint --fix: リポジトリ全体で利用可能なすべての自動修正を実行する
  • bin/lint --verbose: 基盤となる lefthook コマンドを出力する

明示的なファイルを渡すと、bin/lint は lefthook を呼び出す前に、それらのファイルをサポートされている lint 対象のファイルタイプにフィルタリングします。

:information_source: Markdown ドキュメントファイルは現在 bin/lint には含まれていないため、bin/lint path/to/doc.md を実行しても、lint 対象のマッチするファイルがないという報告になります。

lint の対象

正確な設定は 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 の lint

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

チェック:

  • eslint

GJS テンプレートの lint

  • frontend/**/*.gjs
  • マッチするプラグインおよびテーマの .gjs ファイル

チェック:

  • ember-template-lint

SCSS の lint

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

チェック:

  • stylelint

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

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

チェック:

  • yaml-lint
  • script/i18n_lint.rb

型チェック

bin/lint をファイル引数なしで実行すると、フルリポジトリの lint も実行されます。

  • pnpm lint:types

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

:information_source: bin/lint path/to/file およびコミット前のフックは、完全な型チェックを実行しません。完全なリポジトリ全体の lint 実行を行いたい場合は、プレーンな bin/lint を使用してください。

自動修正可能なもの

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

自動修正が設定されているのは以下の通りです。

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

実際には、これにより以下を再フォーマットおよび書き直しできます。

  • Ruby
  • JavaScript / GJS
  • CSS / SCSS

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

  • YAML 構文の検証
  • client.en.yml / server.en.yml の i18n lint
  • Glint/型チェック

git フックとの関係

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

これは次のことを意味します。

  • ステージされたファイルが lint に合格しないため、コミットが失敗する可能性がある
  • 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

# タイプチェックを含む、リポジトリ全体の lint スイートを実行する
bin/lint

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

「いいね!」 11

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