AstroでWranglerを追加したらnpmのEPERMが出た。今回はインストール自体は成功していた
WindowsのAstroプロジェクトでWrangler追加時に出たnpm warn cleanupとEPERM。実際のログを見ながら、どこまで対応したかを残します。

AstroのプロジェクトへWranglerを追加したとき、PowerShellにEPERMが何度も出た。
実行したコマンドはこれ。
npm install --save-dev wrangler
途中のログはかなりエラーっぽい。最初に見たときは、Wranglerの追加そのものに失敗したと思った。
npm warn cleanup Failed to remove some directories
Error: EPERM: operation not permitted, rmdir '...node_modules...'

ただ、このときはWranglerの追加そのものは終わっていた。
ログの最後にadded 31 packagesとfound 0 vulnerabilitiesが出ている。見た目だけでnode_modulesを全部消さずに済んだケース。
出ていたのはnpm warn cleanup#
今回のログで先に見たのはEPERMより、その少し前にあるnpm warn cleanup。
npmが依存関係を処理したあと、一部ディレクトリの削除に失敗している。
code: 'EPERM'
syscall: 'rmdir'
Astroのソースをコンパイルして失敗したわけではない。
Windows上でnode_modules内のディレクトリを消そうとして、OSから拒否された形になる。
開発サーバーや別のNode.jsプロセスがファイルを参照していると、Windowsではこういう状態になることがある。
ログの最後まで進んでいるなら、まずそのまま動作確認した#
自分のときは警告のあともnpmの処理が続いていた。
added 31 packages, changed 1 package, and audited 240 packages in 23s
found 0 vulnerabilities
ここまで出ているなら、少なくとも今回のインストールは途中で完全停止していない。
そのため、いきなり削除や再インストールはせず、次の作業へ進めるかを確認した。
npm run dev
必要なら本番ビルドも見る。
npm run build
起動もビルドも通るなら、表示されたEPERMだけを理由に環境を作り直す必要はなかった。
本当に失敗しているときだけNode.jsを止めて再構築する#
もちろん、毎回無視してよいわけではない。
npm install自体が失敗している、必要なパッケージが入っていない、npm run devが起動しない、といった状態ならファイルロックを疑う。
まず開発サーバーをCtrl+Cで止める。それでもNode.jsプロセスが残っているか確認するならPowerShellで見られる。
Get-Process node -ErrorAction SilentlyContinue
不要なNode.jsプロセスを止める場合は次の形になる。
Get-Process node -ErrorAction SilentlyContinue | Stop-Process -Force
これは別のNode.jsアプリも止める可能性があるので、何が動いているか分からない状態でいきなり実行しない方がいい。
そのうえで依存関係を作り直すなら、当時残していた手順は次の形。
Remove-Item -LiteralPath 'C:\000pj\astro\yumaru-site\node_modules' -Recurse -Force
npm cache verify
npm install
npm run dev
package-lock.jsonは最初から消していない。
ファイルロックの問題と依存関係の解決結果は別なので、まずnode_modulesだけ作り直した方が原因を追いやすい。
npm cache clean --forceは使わなかった#
npmのエラー対応を調べるとnpm cache clean --forceもよく出てくるが、今回は使っていない。
npmの公式ドキュメントではキャッシュは自己修復を前提としていて、状態確認にはnpm cache verifyが用意されている。
npm cache verify
今回のEPERMはrmdirで出ていたので、最初からキャッシュ削除へ進む理由もなかった。
実際にはインストール自体が成功しており、大きな再構築は不要。
EPERMを見たときに自分が先に確認すること#
同じ表示が出たら、最初にログの最後を見る。
npm warn cleanupなのか、npmコマンド自体が失敗して終わっているのかで対応が変わるからだ。
今回のようにパッケージ追加まで完了しているなら、まずAstroを起動する。そこで問題がなければ、その警告を深追いしない。
実際に動かないときだけ、Node.jsプロセス、node_modules、キャッシュ確認の順で触る。
EPERMという文字だけで全部消すより、この順番の方が余計な作業が少なかった。
参考#
- npm公式:npm cache
https://docs.npmjs.com/cli/cache/ - npm公式:npm doctor
https://docs.npmjs.com/cli/v11/commands/npm-doctor/


