Expo npm SDK

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.jsonexpo が上限を超えていると弾かれる。

ストアで公開されている 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に対して既知のバージョンが揃うように reactreact-nativereact-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-doctorexpo の版に対して react-native や周辺のバージョンが期待レンジ内かをチェックしてくれる。--fix で足りなかった場合はここで指摘が出るので、指示通りに expo install を追加で叩く。

ここまで通ったら npx expo start でDev Serverを立てて、実機のExpo GoからQRを読み直す。同じ実機・同じExpo Goで開いていた場合は、以前掴んだキャッシュを外すため実機側のExpo Goでプロジェクトを削除してから読み直すと確実。