npm v5.6.0 にしたら npm install でフリーズする件の対処法
Node.js v8.9.4・npm v5.6.0 にアップデートして、package-lock.json
が存在する状態で npm install
を行うと、loadAllDepsIntoIdealTree
といった表示のところでフリーズする事象に遭遇した。その問題と対処法の紹介。
目次
事象
発生する条件は以下のとおり。
- Node.js v8.9.4・npm v5.6.0 環境
- 一度
npm install
が終了して、package-lock.json
が存在する状態
この状態で、$ npm install --verbose
とやってみると、以下のようになる。
$ npm install --verbose
npm info it worked if it ends with ok
npm verb cli [ '/Users/Neo/.nodebrew/node/v8.9.4/bin/node',
npm verb cli '/Users/Neo/.nodebrew/current/bin/npm',
npm verb cli 'install',
npm verb cli '--verbose' ]
npm info using npm@5.6.0
npm info using node@v8.9.4
npm verb npm-session fecbba3501330a9a
npm info lifecycle example@1.0.0~preinstall: example@1.0.0
⸨ ░░░░░░░░░░░░░░░░⸩ ⠧ loadDep:zone.js: sill install loadAllDepsIntoIdealTree
ココから10分くらい放置すると、処理が再開する、という挙動だった。
この事象自体は Windows でも Mac でも発生するのだが、ハングするプロジェクトとしないプロジェクトがあった。どうも、Node.js・npm のバージョンと、対象のプロジェクトの依存パッケージとに関係があるらしい。
同様の事象を報告する Issue は挙がっていたが、イマイチハッキリせず…。色々調べてみた。
- 参考 : ❤️ NPM freezes at `loadIdealTree` when password-protected SSH key is not in an SSH agent ❤️ · Issue #18108 · npm/npm · GitHub
- 参考 : npm install fails with "ENOENT: no such file or directory" on .DELETE files · Issue #17444 · npm/npm · GitHub
試してダメだった策
最初はただフリーズしているだけかと思ったが、10分間放っておくと処理が再開することが分かった。
ということは、何らかのタイムアウトを待っているのか?と思い、タイムアウトや通信リトライに関係しそうな項目を .npmrc
に書いてみた。
searchstaleness=5
cache-lock-stale=5000
cache-lock-retries=1
cache-lock-wait=5000
fetch-retries=1
fetch-retry-factor=1
fetch-retry-mintimeout=5000
fetch-retry-maxtimeout=5000
しかし効果なし。
次に、ssh-add
コマンドをどうこうしろとかいう回答があったのでやってみた。
- 参考 : npm install gets stuck at sill install loadIdealTree · Issue #17228 · npm/npm · GitHub
- 参考 : macos - How to use Mac OS X Keychain with SSH keys? - Super User
# SSH の秘密鍵を作る : -K オプションで指定した秘密鍵ファイルをキーチェーンに保存できる
$ ssh-add -K ~/.ssh/id_rsa
# -A オプションで全ての鍵をキーチェーンに登録する
$ ssh-add -A
# 作った鍵が存在するか確認する
$ ssh-add -l
# 以下のようなファイルを作る
$ touch ~/.ssh/config
# 中身は以下のようにする : SSH 接続時に鍵を持って行って使ってくれる
Host *
UseKeychain yes
AddKeysToAgent yes
IdentityFile ~/.ssh/id_rsa
しかし効果なし。
さらに、$ npm i -g npm@5.7.1
コマンドで npm を最新版にアップデートして実施してみたが、これも効果なし。
上手く行った方法 : npm v5.5.1 に下げる
以下の記事を見ると、「npm のバージョンを下げたら上手く行った」との報告が。
- 参考 : javascript - Can't install cordova with npm 5.6.0 - Stack Overflow
- npm v5.3.0 に下げると上手く行った人。
- 参考 : Can't install with Node 9.2.1 · Issue #26 · dpa99c/cordova-check-plugins · GitHub
- npm v5.5.1 に下げると上手く行った人。
Node.js のリリース一覧を見ると、Node.js のバージョンごとに、付属する npm のバージョンが記録されている。コレによると、Node.js v8 系で npm v5.5.1 が入るのは、v8.9.3 までらしい。
- 参考 : リリース一覧 | Node.js
これまで使用していたのは Node.js v8 系の最新版である v8.9.4 だったが、ここから1つ前の v8.9.3 に下げ、npm v5.5.1 をインストールしてみた。
この状態で npm install
してみると、今度はハング・フリーズすることなくインストールが成功した。
原因を独自調査
今回、この事象が発生するプロジェクトと発生しないプロジェクトがあった。両者で基本パッケージには差異がないのだが、片方はマイナーな Cordova プラグインをインストールする都合上、package.json
にバージョン番号が記載されず、git+https://
で始まる URL が記載されていた。
どうもこの「バージョン番号が記載されないパッケージ」が存在すると、インストール時に10分間ハングするようであった。回避策らしい回避策も他になかったので、今回は npm のバージョンを v5.5.1 に下げることでしのいだ。