Expo で開発したアプリを実機で確認しようとすると Project is incompatible with this version of Expo Go と出て起動しない。原因は、ストアからインストールした Expo Go アプリが対応する Expo SDK のバージョン範囲と、プロジェクトの expo パッケージのバージョンが噛み合っていないことにある。ストアの Expo Go を古い版に差し替えるのは実質不可能なので、プロジェクト側のSDKを下げて合わせる。
まず確認するのはExpo Go側の対応SDK
Expo Go はアプリ本体が持っている「動かせるSDKバージョン」に上限がある。プロジェクトの package.json の expo が上限を超えていると弾かれる。
ストアで公開されている Expo Go は基本1バージョンで、しかも最新版に近いSDKまで対応済みになっていることが多い。にもかかわらず噛み合わない場合の典型は、プロジェクトを npx create-expo-app で作った直後で、雛形が「まだストアのExpo Goが対応していない最新SDK」を掴んでいるケースだ。この場合はプロジェクト側を下げる方向で揃える。
プロジェクトのSDKを下げる手順
下げたい版を ~54.0.0 のように ~ 付きで指定してインストールし、周辺パッケージも expo install で整合させる。
npm install expo@~54.0.0
npx expo install --fix
expo install --fix は、その版のExpo SDKに対して既知のバージョンが揃うように react、react-native、react-native-webview などを自動で調整する。手で npm install react-native@0.81.5 と1つずつ打つよりこれに任せた方が事故がない。
下げる先の版はストアの Expo Go アプリの説明ページに書かれていることが多いが、実機で Project is incompatible のダイアログに出ている「サポートされるSDK」の記載を見るのが確実。
ENOTEMPTY で落ちた時は消してから入れ直す
ダウングレードの npm install で以下のように失敗することがある。
npm error code ENOTEMPTY
npm error syscall rename
npm error path .../node_modules/...
これは既存の node_modules と新しい依存関係が食い違って、npmが古いディレクトリを移動できないケース。再試行しても直らないので、いったん消すのが速い。
rm -rf node_modules package-lock.json
npm install expo@~54.0.0
npx expo install --fix
いきなり node_modules を消すのはやや荒っぽく見えるが、package.json と lockfile が正しければ再現できるので実質のロールバックリスクはない。
整合が取れたか確認する
インストールが終わったら、次のコマンドで expo と主要パッケージのバージョンが揃っているか見る。
npx expo-doctor
expo-doctor は expo の版に対して react-native や周辺のバージョンが期待レンジ内かをチェックしてくれる。--fix で足りなかった場合はここで指摘が出るので、指示通りに expo install を追加で叩く。
ここまで通ったら npx expo start でDev Serverを立てて、実機のExpo GoからQRを読み直す。同じ実機・同じExpo Goで開いていた場合は、以前掴んだキャッシュを外すため実機側のExpo Goでプロジェクトを削除してから読み直すと確実。