Expo SDK 54のアプリでAndroidビルドが失敗しました。原因は、expo本体がSDK 54のままなのに、一部のExpoパッケージだけSDK 55向けになっていたことです。
TypeScriptの型チェックと開発サーバーは通っていたため、EAS Buildを実行するまで気付きませんでした。実際にずれていた依存関係を例に、切り分けから修正までを順に整理します。
起きていたこと
package.jsonは次のような状態でした。
{
"dependencies": {
"expo": "~54.0.33",
"expo-apple-authentication": "~55.0.13",
"expo-dev-client": "^55.0.27",
"expo-image-picker": "^55.0.18",
"expo-linking": "^55.0.12",
"expo-notifications": "^55.0.19",
"expo-splash-screen": "^55.0.18"
}
}
expoは54系ですが、その周辺に55系のパッケージが並んでいます。個別にパッケージを追加した際、最新版をそのまま入れたことが原因でした。
Expoのパッケージは、名前にSDK番号が入っていないものもあります。たとえばSDK 54で使うexpo-notificationsは0.32系、expo-splash-screenは31系です。パッケージのメジャーバージョンだけ見ても、対応するSDKは判断できません。
まずexpo install --checkを実行する
対応バージョンの確認にはExpo CLIを使います。
npx expo install --check
SDK 54以降では、JSON形式でも確認できます。
npx expo install --check --json
このコマンドは、現在のExpo SDKに対して期待されるバージョンと、実際にインストールされているバージョンを比較します。package.jsonを目視して推測するより確実です。
まとめて修正する場合は次を使えます。
npx expo install --fix
npx expo-doctor
今回は変更内容を確認したかったため、表示された対応バージョンを見ながらpackage.jsonを修正しました。
実際に揃えたバージョン
主な変更は次の通りです。
- "expo-apple-authentication": "~55.0.13"
+ "expo-apple-authentication": "~8.0.8"
- "expo-dev-client": "^55.0.27"
+ "expo-dev-client": "~6.0.21"
- "expo-image-picker": "^55.0.18"
+ "expo-image-picker": "~17.0.11"
- "expo-linking": "^55.0.12"
+ "expo-linking": "~8.0.12"
- "expo-notifications": "^55.0.19"
+ "expo-notifications": "~0.32.17"
- "expo-splash-screen": "^55.0.18"
+ "expo-splash-screen": "~31.0.13"
修正後にlockfileを更新し、もう一度チェックします。
pnpm install
pnpm --filter @squadnote/mobile exec expo install --check
pnpm --filter @squadnote/mobile exec expo-doctor
monorepoでは、コマンドを実行するpackageを間違えないようにします。ルートで実行して意図したpackage.jsonを見ていなかった、という状態を避けるためです。
TypeScriptでは見つからなかった理由
JavaScript側のAPIと型定義だけなら、異なるSDK向けのパッケージでも処理できる場合があります。一方、EAS Buildではconfig pluginやネイティブモジュールも含めてiOS、Androidのプロジェクトを組み立てます。
今回の不一致は、アプリコードの型ではなくネイティブ側の組み合わせで表面化しました。tscが通っても、Expo SDKとの互換性まで確認できたことにはなりません。
再発を防ぐ
Expo管理パッケージを追加するときは、package managerを直接使わずexpo installを使うようにしました。
npx expo install expo-notifications
この形なら、現在のSDKに合うバージョンが選ばれます。SDKを更新した後は、EAS Buildを始める前に次の2つを実行します。
npx expo install --check
npx expo-doctor
今回の失敗は、SDKのアップグレードそのものではなく、SDK 54のプロジェクトへSDK 55向けパッケージを個別に追加したことで起きました。package.jsonの数字を眺めるより、Expo CLIに互換性を検査させる方が早く見つけられます。