先に結論

エラー:

  • Cannot read property ‘length’ of undefined

条件:

  • npm v6.7+
  • package.jsonpostinstall 等があり、かつ name がない場合
  • npm installnpm ci 実行時

対処:

  • とりあえず package.jsonname の設定すれば通る

あらすじ

TravisCI の自動試験で失敗の通知。

今まで Node.js v10.15 だったのが v10.16 になって失敗するようになった。過去に通ったやつも再試行すると失敗する。ひゃあ。

$ npm ci 
npm ERR! Cannot read property 'length' of undefined

debug.log はこんな感じ。

...
2533 info lifecycle [email protected]~install: [email protected]
2534 info lifecycle [email protected]~postinstall: [email protected]
2535 info lifecycle undefined@undefined~install: undefined@undefined
2536 info lifecycle undefined@undefined~postinstall: undefined@undefined
2537 verbose stack TypeError: Cannot read property 'length' of undefined
2537 verbose stack     at _incorrectWorkingDirectory (/home/ginpei/.nvm/versions/node/v10.16.0/lib/node_modules/npm/node_modules/npm-lifecycle/index.js:100:60)
2537 verbose stack     at /home/ginpei/.nvm/versions/node/v10.16.0/lib/node_modules/npm/node_modules/npm-lifecycle/index.js:72:44
2537 verbose stack     at /home/ginpei/.nvm/versions/node/v10.16.0/lib/node_modules/npm/node_modules/npm-lifecycle/index.js:203:12
2537 verbose stack     at /home/ginpei/.nvm/versions/node/v10.16.0/lib/node_modules/npm/node_modules/graceful-fs/polyfills.js:285:20
2537 verbose stack     at FSReqWrap.oncomplete (fs.js:154:5)
2538 verbose cwd /mnt/c/Users/ginpei/projects/webextension-pomodoro
2539 verbose Linux 4.4.0-17763-Microsoft
2540 verbose argv "/home/ginpei/.nvm/versions/node/v10.16.0/bin/node" "/home/ginpei/.nvm/versions/node/v10.16.0/bin/npm" "ci"
2541 verbose node v10.16.0
2542 verbose npm  v6.9.0
2543 error Cannot read property 'length' of undefined
2544 verbose exit [ 1, true ]

undefined@undefined とは……。

原因

手元で動かして追ってみる。

ということで、落ちる行まで追えた。

npm の実装は見たことないので細かいことわからないけど、ここの pkg.name.length が大丈夫なら解決しそう。

あと postinstall 削っても動いたので、ライフサイクル回りが npm v6.9 までに何か変わったのかも。

対処

というわけで、package.jsonname を追加するとビルドが通るようになった。

本当なら報告したいけど Issue 作成は開かれてないし、この機に触ってみて PR 投げて貢献しようかな……と思って一月経ちました。