react-native run-ios したら The following build commands failed:PhaseScriptExecution Start\ Packager と言われてこける

表題のとおり、react-native run-ios したら、The following build commands failed: PhaseScriptExecution Start\ Packager と怒られて先に進めなかった時のメモ。

結論を言うと、使いたいポートがnodeに使われていた。sunproxyadminなるプロセスとかぶっているらしい…killしたらとおった。

環境

  • MacBook Pro 2019
  • macOS 10.15.7
  • react-native 0.62.0
  • node.js 12.20.0

やりたいこと

いつものように react-native run-ios を走らせたところ、The following build commands failed: PhaseScriptExecution Start\ Packager…… などと怒られた。やたら長いシェルスクリプトの実行に失敗している。いつもはこんなことなかったのに……。

React Nativeのインストールとweb版からの移植ではまったこと – Qiitaによると、8081のポートが埋まっているために起きるエラーらしい。実際に、実行しようとしているスクリプトの中を見たらこんなだった。

#!/bin/sh
export RCT_METRO_PORT="${RCT_METRO_PORT:=8081}"
echo "export RCT_METRO_PORT=${RCT_METRO_PORT}" > "${SRCROOT}/../node_modules/react-native/scripts/.packager.env"
if [ -z "${RCT_NO_LAUNCH_PACKAGER+xxx}" ] ; then
  if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then
    if ! curl -s "http://localhost:${RCT_METRO_PORT}/status" | grep -q "packager-status:running" ; then
      echo "Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly"
      exit 2
    fi
  else
    open "$SRCROOT/../node_modules/react-native/scripts/launchPackager.command" || echo "Can't start packager automatically"
  fi
fi

なんかよくわからんが8081番を使っている。

$ sudo lsof -i :8081
Password:
COMMAND  PID     USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node    1979 xxxx   24u  IPv6 0x2219967c326c265d      0t0  TCP *:sunproxyadmin (LISTEN)

なるほど。nodeのsunproxyadminなるものが動いている。なんだろう……。「macos – Can’t package react native because of port 8081 sunproxyadmin – Stack Overflow」を見ると、sunproxyadminが使うポートで、80と同じ役割をしている、らしい。で、プロセスをkillしたりなんだりして頑張っている。でも、いままでこんなことなかったのに。たまたまかぶっただけだったりしないのだろうか……。

ということで、伝家の宝刀再起動をした。再起動後、再度8081番が使われているか見ると、使われていない。で、改めて react-native run-ios を走らせたところ、うまくいった。

なんだが……もう1回Archiveしてみると、また同じ失敗エラーが起きた。で、8081を見てみたらまたsunprocyadmin。oh……。

ということで、lsofで得られるPIDをkill -9して殺し、再度Archiveを実行。どうなるかな、と思っていたが、今度はなんとかいけた。。。

関連記事

スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。