できない.dev

.prettierignore が効かない/除外したファイルが整形される

Prettier の ignore は CLI に渡したパスより弱く、明示指定されたファイルは ignore を無視して整形される。
`.prettierignore` の配置、glob の順序、エディタ拡張の `prettier.ignorePath` 指定を順に確認すれば大半は解消する。

#prettier#ignore#prettierignore#config#format

公開:

要約

Prettier の ignore は CLI 引数で直接指定したファイル名には効かない
これは ignore 設計上の仕様で、prettier --write src/generated.ts のように個別指定するとそのファイルは整形される。
ディレクトリで渡す、.prettierignore をルートに置く、glob 順序を見直す、エディタ拡張の prettier.ignorePath を明示する、の 4 点で解消する。

よくある原因

  1. CLI 引数の直接指定: prettier --write src/foo.ts のような個別指定は ignore より強い。
    CI スクリプトで git diff --name-only の結果をそのまま渡しているとよく起きる。
  2. .prettierignore の配置: Prettier は process.cwd().prettierignore を読む。
    サブディレクトリで実行すると別の(または存在しない)ignore を見に行ってしまう。
  3. ! glob の順序: *.js で除外した後に !src/** で復活させたい場合、後段が勝つルール。
    順序を逆にすると除外解除が効かない。
  4. エディタ拡張の独自挙動: VSCode の esbenp.prettier-vscode 拡張は基本的に .prettierignore を読むが、ネストしたモノレポでは prettier.ignorePath の明示が必要なことがある。

解決策

1. ディレクトリで対象を渡す

# NG: 個別指定(ignore が効かない)
npx prettier --write src/generated/api.ts
 
# OK: ディレクトリ全体を対象に
npx prettier --write .

公式の Ignoring Code ドキュメント でも明記されているとおり、ignore は 対象パスの絞り込みフィルタ であって、明示指定されたファイルには適用されない。

2. ルートに置く / --ignore-path で指定

# モノレポでパッケージ固有の ignore を使いたい場合
npx prettier --write --ignore-path packages/web/.prettierignore packages/web

CLI ドキュメント--ignore-path は v3 以降で複数指定もできる。

3. glob の順序を見直す

# .prettierignore
**/*.js
!src/utils/**.js   # src/utils 配下の .js は整形対象に戻す
dist/
build/

後で書いたルールが勝つ。
除外を「打ち消す」ルールは 対象除外の後 に書く。

4. VSCode 拡張に ignore パスを教える

// .vscode/settings.json
{
  "prettier.ignorePath": "./.prettierignore",
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "editor.formatOnSave": true
}

モノレポで複数の .prettierignore がある場合、ワークスペースごとに prettier.ignorePath を明示しないと拡張機能が誤った ignore を読みかねない。

この記事は役立ちましたか?