ESLint で ignore 指定したファイルが無視されない
ESLint v9 (flat config) では .eslintignore は廃止され、eslint.config.js 内の ignores プロパティでのみ無視指定する。
グローバル ignore にしたい場合は files を併記せず ignores 単独のオブジェクトで宣言し、否定パターン(!)は後段に置く。
#ignore#config#flat-config#eslintignore
公開:
要約
ESLint で「無視したはずのファイルがチェックされる」原因の大半は、v9 の flat config 移行に伴うもの。
v9 では .eslintignore を読まなくなり、eslint.config.js の ignores キーが唯一の指定方法。
グローバル無視にしたい場合は files を併記せず { ignores: [...] } 単独のオブジェクトで書く。
glob は ** の有無や否定パターンの順序に注意する。
よくある原因
- リポジトリを ESLint v9 にアップグレードしたが、
.eslintignoreを残したまま運用している。
v9 はこのファイルを参照しない。 eslint.config.jsの途中に{ files: ["src/**/*.ts"], ignores: ["src/legacy/**"] }のように書いてしまい、src/legacy/**のチェックを「特定ルール構成から外す」だけになっていて、ESLint 全体のスキャン対象からは外れていない。- ディレクトリを
distとだけ書いても、それは「distという名前のファイル」にしかマッチしない。
配下まで除外したいならdist/**。 eslint src/a.tsのようにファイルを直接渡すと、ignore 設定があっても警告付きで実行される。
CI ログでは「無視されていないように見える」原因になる。
解決策
1. flat config でグローバル ignore を書く
// eslint.config.js
export default [
{ ignores: ["dist/**", "coverage/**", "**/*.generated.ts"] },
// ... 他の設定オブジェクト
];ignores 単独のオブジェクトはグローバルに作用する(公式ドキュメント)。files を併記すると、その files で絞り込んだ範囲内の局所 ignore になってしまう。
2. パターンの粒度を直す
ignores: [
"node_modules/**",
"dist/**",
"**/__generated__/**",
"!src/important.generated.ts" // 例外で含めたいファイルは ! を後ろに
]否定パターン(!)は 後段 に置く。
順序を逆にすると効かない。
3. legacy 設定を維持する場合
package.json で eslint@^8 のままなら .eslintignore は有効。
ただしルートからの相対パスで書く必要があり、サブパッケージ単位の ignore は各ディレクトリに .eslintignore を置く。
4. CLI に渡すファイルを絞る
npm run lint のスクリプトを eslint . にしておけば ignore が確実に効く。eslint <ファイル名> を直書きしている場合は、ignore よりも CLI 引数が優先される点に注意。