npm の ENOENT エラー:原因と解決策
結論 npm error code ENOENT は、何かが見つからなかったという意味です。npm が加える説明も2文しかありません。「npm がファイルを見つけられないことに関係している」と述べ、file の値がある場合だけ「そのファイルが存在するか確認してください」と続きます。 したがって、原因を絞る材料は説明文ではなく、npm が併記する診断用の項目にあります。実装では code、syscall、file、path、dest、errno の6つのうち、値が入っているものだけを並べて出力します。このうち syscall が何をしようとして失敗したか、path がどこで失敗したかを示します。 読み方は単純です。syscall が open で path が package.json で終わっていれば、そのディレクトリにプロジェクトの定義が無いという意味になります。syscall が spawn git であれば、ファイルではなく外部コマンドが見つかっていません。path が node_modules の下を指していれば、導入済みのはずの中身が欠けています。 この2項目を見ないまま npm install を繰り返しても状況は変わりません。まず対象を特定してください。 エラーが発生する処理段階 npm の処理は段階に分かれており、ENOENT はどの段階でも起こります。ただし失敗した対象を見れば段階は特定できます。 第一段階はプロジェクトの読み取りです。npm はカレントディレクトリから package.json を探します。ここで見つからなければ、依存の解決にも取得にも進みません。 第二段階は依存の解決です。レジストリからの取得だけであれば外部コマンドは不要ですが、git の場所を指定した依存が含まれる場合、npm は git を起動します。この起動に失敗すると syscall が spawn git になります。 第三段階は取得と展開で、node_modules の下に書き込みます。前回の実行が途中で終わっていると、この段階の読み取りで欠けた対象に当たります。 第四段階は導入後のスクリプト実行です。ここで外部コマンドが見つからない場合も、同じ形の失敗になります。 段階が違えば path の指す場所も変わります。逆に言えば、path を見れば段階が分かります。 最初に確認すること まず、出力の診断用の行だけを抜き出します。 npm install 2>&1 | grep -E "npm error (code|syscall|path|file|dest|errno)" 出力はこの形になります。 ...