できない.dev

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.jsignores キーが唯一の指定方法。
グローバル無視にしたい場合は files を併記せず { ignores: [...] } 単独のオブジェクトで書く。
glob は ** の有無や否定パターンの順序に注意する。

よくある原因

  1. リポジトリを ESLint v9 にアップグレードしたが、.eslintignore を残したまま運用している。
    v9 はこのファイルを参照しない。
  2. eslint.config.js の途中に { files: ["src/**/*.ts"], ignores: ["src/legacy/**"] } のように書いてしまい、src/legacy/** のチェックを「特定ルール構成から外す」だけになっていて、ESLint 全体のスキャン対象からは外れていない。
  3. ディレクトリを dist とだけ書いても、それは「dist という名前のファイル」にしかマッチしない。
    配下まで除外したいなら dist/**
  4. 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.jsoneslint@^8 のままなら .eslintignore は有効。
ただしルートからの相対パスで書く必要があり、サブパッケージ単位の ignore は各ディレクトリに .eslintignore を置く。

4. CLI に渡すファイルを絞る

npm run lint のスクリプトを eslint . にしておけば ignore が確実に効く。eslint <ファイル名> を直書きしている場合は、ignore よりも CLI 引数が優先される点に注意。

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