npm v5.6.0 にしたら npm install でフリーズする件の対処法

Node.js v8.9.4・npm v5.6.0 にアップデートして、package-lock.json が存在する状態で npm install を行うと、loadAllDepsIntoIdealTree といった表示のところでフリーズする事象に遭遇した。その問題と対処法の紹介。

目次

事象

発生する条件は以下のとおり。

この状態で、$ 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 は挙がっていたが、イマイチハッキリせず…。色々調べてみた。

試してダメだった策

最初はただフリーズしているだけかと思ったが、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 コマンドをどうこうしろとかいう回答があったのでやってみた。

# 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 のバージョンを下げたら上手く行った」との報告が。

Node.js のリリース一覧を見ると、Node.js のバージョンごとに、付属する npm のバージョンが記録されている。コレによると、Node.js v8 系で npm v5.5.1 が入るのは、v8.9.3 までらしい。

これまで使用していたのは 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 に下げることでしのいだ。