.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 点で解消する。
よくある原因
- CLI 引数の直接指定:
prettier --write src/foo.tsのような個別指定は ignore より強い。
CI スクリプトでgit diff --name-onlyの結果をそのまま渡しているとよく起きる。 .prettierignoreの配置: Prettier はprocess.cwd()の.prettierignoreを読む。
サブディレクトリで実行すると別の(または存在しない)ignore を見に行ってしまう。!glob の順序:*.jsで除外した後に!src/**で復活させたい場合、後段が勝つルール。
順序を逆にすると除外解除が効かない。- エディタ拡張の独自挙動: 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/webCLI ドキュメント の --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 を読みかねない。