先に結論
エラー:
- Cannot read property ‘length’ of undefined
条件:
- npm v6.7+
package.json
にpostinstall
等があり、かつname
がない場合npm install
やnpm ci
実行時
対処:
- とりあえず
package.json
でname
の設定すれば通る
あらすじ
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
とは……。
原因
手元で動かして追ってみる。
package.jsonでnameを指定してないと落ちるみたい。ここ↓で参照エラーになる。npm v6.9.0でそうなってて、node v10.15付属のv6.4.1の場合到達しない。非同期処理なのでスタックトレースはfs.jsのFSReqWrap.oncompleteなる個所まで。
— 高梨ギンペイ (@ginpei_jp) June 12, 2019
というわけで名前を書けばひとまず回避できることがわかった。が。 pic.twitter.com/yZlMcjqPR3
ということで、落ちる行まで追えた。
npm の実装は見たことないので細かいことわからないけど、ここの pkg.name.length
が大丈夫なら解決しそう。
あと postinstall
削っても動いたので、ライフサイクル回りが npm v6.9 までに何か変わったのかも。
npm v6.7+で起きるみたい。postinstallがあり、nameがない場合。 pic.twitter.com/lrRhHahBe6
— 高梨ギンペイ (@ginpei_jp) June 12, 2019
対処
というわけで、package.json
で name
を追加するとビルドが通るようになった。
本当なら報告したいけど Issue 作成は開かれてないし、この機に触ってみて PR 投げて貢献しようかな……と思って一月経ちました。