冒頭まとめ
npm warn EBADENGINEは、パッケージが要求するNode.jsまたはnpmのバージョンを、現在の環境が満たしていないという警告です。最初に、ログのpackage、required、currentを確認します。
通常は警告として表示され、これだけではインストールを止めません。ただし、engine-strict=trueが有効な場合は、同じ不一致でnpm error code EBADENGINEとなり、インストールが停止する場合があります。
警告のままインストールできても、動作確認が済んだことにはなりません。プロジェクトが指定するNode.js・npmの版と、警告に出たパッケージの要件を合わせてから、インストールとテストをやり直してください。
EBADENGINEが示していること
パッケージのpackage.jsonには、実行環境の要件をenginesとして記述できます。
{
"engines": {
"node": ">=24",
"npm": ">=11"
}
}
この例はNode.js 24以上、npm 11以上を要求しています。数値は説明用で、すべてのプロジェクトにこの版を推奨するものではありません。
npm公式文書のenginesの説明では、engine-strictが設定されていない場合、この指定は原則として助言的な扱いになると説明されています。
npm-install-checksの実装は、engines.nodeとengines.npmをそれぞれ現在の版と比較し、どちらかが条件を満たさなければEBADENGINEを生成します。Node.jsだけ確認しても、npm側の不一致が残ることがあります。
新しい版なら必ず通るわけでもありません。たとえば>=18 <24という要件では、Node.js 24は範囲外です。要求されている下限と上限の両方を確認します。
警告にある3項目を確認する
表示例は次のとおりです。パッケージ名と値は説明用です。npmの版によって、接頭辞がnpm WARNなどになることがあります。
npm warn EBADENGINE Unsupported engine {
npm warn EBADENGINE package: 'example-package@1.2.3',
npm warn EBADENGINE required: { node: '>=24', npm: '>=11' },
npm warn EBADENGINE current: { node: 'v22.0.0', npm: '11.0.0' }
npm warn EBADENGINE }
packageは要件に合わないパッケージと版、requiredはそのパッケージの要求、currentは実行時のNode.js・npmの版です。この例ではnpmの条件は満たしていますが、Node.jsの条件を満たしていません。
失敗した処理と同じターミナルやCIジョブで確認します。
node -v
npm -v
node -p "process.execPath"
バージョン管理ツールを使っている場合、別のターミナルやIDEでは別のNode.jsが選ばれていることがあります。process.execPathは、実際に起動したNode.jsの場所を確認するために使います。
実例として、npm/cliのIssue #2728には、Angular CLI 11.2.1がnpm ^6.11.0を要求するのに、npm 7.5.3でインストールして警告が出た報告があります。報告中のNode.js 15.9.0は要求された>=10.13.0を満たしており、不一致はnpm側でした。インストール自体は完了していますが、この過去の報告は現在のAngularの対応版を示すものではありません。
Node.jsとnpmの版を合わせる
まず、プロジェクトのREADME、package.json、.nvmrc、.node-version、CI設定などに指定された環境を確認します。警告を消すためだけに最新版へ変えると、ほかの依存パッケージの上限に合わなくなる場合があります。
対象パッケージの要件は、版を指定して確認できます。次の名前と版は、ログのpackageに表示された実際の値へ置き換えてください。
npm view example-package@1.2.3 engines
版を省略すると、警告に出た版とは異なる要件を確認してしまう可能性があります。取得先へのアクセスが必要なコマンドなので、通信に失敗した場合は、そのエラーも別に確認します。
Node.jsとnpmをプロジェクトの要件に合わせたら、版を再確認し、元のnpm installまたはnpm ciを再実行します。その後、プロジェクトが定めたテストやビルドを実行してください。
環境の版を変更できない場合は、その環境に対応するパッケージ版を調べます。古い版へ戻す際は、必要な機能や修正が含まれるかも確認します。package-lock.jsonを先に削除することは、EBADENGINEの一般的な解決手順ではありません。
間接的な依存が原因の場合
警告に出たパッケージがpackage.jsonの直接依存に見当たらない場合は、別のパッケージが内部で使っている依存かもしれません。
インストールが完了している場合は、次で依存経路を調べられます。名前は実際のパッケージへ置き換えます。
npm explain example-package
npm explainの公式文書は、このコマンドを、パッケージがインストールされた理由となる依存関係の表示に使うと説明しています。
間接依存が原因なら、そのパッケージを直接追加する前に、どの直接依存から入っているかを確認します。直接依存の更新で対応できるか、現在の依存構成が求めるNode.jsを使うかを判断してください。インストールが途中で止まった場合は、npm explainで十分な情報が得られないこともあるため、警告の名前とlockfileも手がかりにします。
手元では警告がなくCIだけに出る場合は、CIのNode.js・npmの指定を確認します。Dockerで起きる場合は、コンテナ内の版とDockerfileのベースイメージを確認してください。ホスト側のNode.jsだけ変更しても、コンテナの環境は変わりません。
engine-strictで停止する場合
現在の設定は次で確認できます。
npm config get engine-strict
npmの設定文書によると、既定値はfalseです。npmの依存ツリー構築の実装では、通常の対象依存について、要件不一致をengine-strictが有効なら例外として扱い、無効なら警告として記録します。省略可能な依存などには別の処理もあるため、すべての依存が同じように扱われるとは限りません。
trueなら、プロジェクトやユーザーの.npmrc、CIの環境変数、実行時のフラグを確認します。要件を守るために設定されている場合は、Node.js・npmの版を合わせるのが基本です。
一時的に警告扱いへ変更することが意図に合う場合は、次の指定もできます。
npm install --no-engine-strict
これは不一致を直す操作ではありません。インストールを継続させた後も、実行時の互換性を確認する必要があります。
--forceにも要件不一致を許容する効果がありますが、公式文書では、ほかの保護も解除する設定として説明されています。EBADENGINEを解消するための通常の第一候補にはしません。
補足:似ているが別のもの
| 表示・設定 | 確認すること |
|---|---|
npm warn EBADENGINE | Node.js・npmの要件不一致。警告以外の失敗もログで確認 |
npm error code EBADENGINE | 要件不一致に加え、engine-strictなど停止する条件を確認 |
EBADPLATFORM | OS・CPUなどの対象環境に関する条件を確認 |
devEngines | 開発に使う環境を検査する別のフィールド。enginesと区別する |
ERESOLVE | 依存関係の解決ができない問題。Node.jsの版チェックとは区別する |
devEnginesはengines.devEnginesではなく、package.jsonの別のトップレベル項目です。公式文書では、enginesとは形式も目的も異なる仕組みとして説明されています。
警告の後に別のエラーが出てインストールが止まった場合は、EBADENGINEだけを原因と決めつけないでください。最後のエラーコードと、失敗した処理も確認します。
解決手順のまとめ
まず警告のpackage、required、currentを読み、Node.jsとnpmのどちらが条件を満たしていないかを確認します。次に、同じ実行環境で現在の版を調べ、プロジェクトと対象パッケージの要求に合わせます。
間接依存が原因なら依存経路を調べ、CIやDockerだけで発生する場合は、その環境の版を確認します。エラーで停止する場合はengine-strictの設定元も確認してください。
インストールが通った後は、テストとビルドで動作を確かめます。「警告だから問題ない」「新しいNode.jsなら必ず解決する」とは判断せず、要求された範囲に合わせることが基本です。
免責事項:本記事の内容は一般的なnpmおよびNode.jsの構成を前提としています。対応する版や検査の挙動は、パッケージとnpmのバージョンによって異なります。環境や依存関係を変更する前に、プロジェクトの要件を確認してください。
この記事でエラーは解決しましたか?