EAS 构建
使用 EAS 准备开发、预览、生产和 OTA 构建。
EAS 是这个 Expo 模板的原生分发路径。开发客户端、内部预览包、商店包和
OTA 更新都走它。pnpm web 适合开发时快速验证,但 iOS 和 Android 发布
需要 EAS Build 和 EAS Submit。
项目绑定
app.config.ts 包含 EAS project ID:
const EAS_PROJECT_ID = "3e167ef9-3e6c-47f2-9d14-01f738667145";同一个文件还配置了:
extra.eas.projectIdupdates.url = https://u.expo.dev/<project-id>runtimeVersion: { policy: "appVersion" }- 按 variant 区分的显示名、bundle identifier、package name 和 scheme
fork 模板后,请替换成你自己的 EAS 项目:
eas login
eas init然后提交更新后的 app.config.ts。
Build profiles
eas.json 自带三个 profile:
| Profile | 分发方式 | Channel | 原生细节 | Env |
|---|---|---|---|---|
development | Internal | development | developmentClient: true | APP_VARIANT=development,SENTRY_ENVIRONMENT=development |
preview | Internal | preview | Android APK,iOS 真机构建,不是 iOS simulator | APP_VARIANT=preview,SENTRY_ENVIRONMENT=preview |
production | Store | production | autoIncrement: true | APP_VARIANT=production,SENTRY_ENVIRONMENT=production |
CLI 配置是:
{
"version": ">= 16.0.0",
"appVersionSource": "remote"
}Remote app version source 表示构建号由 EAS 管理。需要查看或手动调整版本时,
使用 eas build:version:get 和 eas build:version:set。
App variants
模板支持开发、预览和生产三个应用并排安装:
| Variant | 名称 | Bundle ID / package | Scheme |
|---|---|---|---|
| Development | Soar Starter (Dev) | expo.soarstarter.com.dev | soar-starter-expo-dev |
| Preview | Soar Starter (Preview) | expo.soarstarter.com.preview | soar-starter-expo-preview |
| Production | Soar Starter | expo.soarstarter.com | soar-starter-expo |
本地按同样 variant 启动 Metro:
pnpm dev
pnpm dev:preview
pnpm dev:prod配套使用 .env.local、.env.preview,或 shell/EAS 环境变量,确保 bundle
拿到正确的 Supabase project、RevenueCat key、链接域名和商店 URL。
环境变量和 secret
EXPO_PUBLIC_* 值是公开的。它们会被内联进 JavaScript bundle,任何拿到
app 二进制的人都能查看。
把可公开的 client 值放进 Expo/EAS env:
EXPO_PUBLIC_SUPABASE_URL=
EXPO_PUBLIC_SUPABASE_ANON_KEY=
EXPO_PUBLIC_REVENUECAT_IOS_KEY=
EXPO_PUBLIC_REVENUECAT_ANDROID_KEY=
EXPO_PUBLIC_POSTHOG_API_KEY=
EXPO_PUBLIC_SENTRY_DSN=服务端 secret 不要进客户端 bundle:
| Secret | 应该放在哪里 |
|---|---|
REVENUECAT_WEBHOOK_AUTH | Supabase Edge Function secret |
可选 send-test-push 的 APNs keys | Supabase Edge Function secrets |
SENTRY_AUTH_TOKEN | EAS secret 或 CI secret,用于 sourcemap 上传 |
| Supabase service role key | 永远不要放进 Expo env;Supabase 会注入 Edge Functions |
SENTRY_ENVIRONMENT 已按 EAS profile 设置。上传 sourcemap 时再提供
SENTRY_AUTH_TOKEN。
构建命令
安装 development client:
eas build --profile development --platform ios
eas build --profile development --platform android创建内部预览包:
eas build --profile preview --platform ios
eas build --profile preview --platform android创建商店包:
eas build --profile production --platform ios
eas build --profile production --platform android云端构建是常规路径。本地构建适合排查原生配置,但仍然需要本地 Xcode 或 Android 工具链:
eas build --profile development --platform ios --local
eas build --profile development --platform android --local安装 development build 后启动 Metro:
pnpm dev然后打开已安装的 dev client。Expo Go 可以渲染很多页面,但 purchases 和 Google Sign-In 这类原生模块需要 development 或 store build。
OTA 更新
模板包含 expo-updates:
runtimeVersion: { policy: "appVersion" },
updates: { url: "https://u.expo.dev/<project-id>" }Channel 和 EAS profile 对应:
| Channel | Build profile | 用途 |
|---|---|---|
development | development | dev client 开发测试 |
preview | preview | 内部 QA 更新 |
production | production | 商店包更新 |
向匹配的 channel 发布 OTA:
eas update --channel preview --message "Fix onboarding copy"
eas update --channel production --message "Update paywall text"OTA 可以发布 JavaScript、样式、文案和随 update 打包的资源。它不能发布新的 原生模块、config plugin 变化、新权限、bundle ID 变化或商店元数据变化。 这些都需要新的 EAS build。
因为 runtime policy 是 appVersion,OTA 只会到达同 app version 的构建。
如果 update 没有到达,先检查 channel 和 runtime version。
Submit 入口
生产构建完成后提交商店:
eas submit --profile production --platform ios
eas submit --profile production --platform android模板的 submit.production 为空,所以第一次提交会提示选择商店凭证和 app。
商店侧准备请看 商店发布。
