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.projectId
  • updates.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
developmentInternaldevelopmentdevelopmentClient: trueAPP_VARIANT=developmentSENTRY_ENVIRONMENT=development
previewInternalpreviewAndroid APK,iOS 真机构建,不是 iOS simulatorAPP_VARIANT=previewSENTRY_ENVIRONMENT=preview
productionStoreproductionautoIncrement: trueAPP_VARIANT=productionSENTRY_ENVIRONMENT=production

CLI 配置是:

{
  "version": ">= 16.0.0",
  "appVersionSource": "remote"
}

Remote app version source 表示构建号由 EAS 管理。需要查看或手动调整版本时, 使用 eas build:version:geteas build:version:set

App variants

模板支持开发、预览和生产三个应用并排安装:

Variant名称Bundle ID / packageScheme
DevelopmentSoar Starter (Dev)expo.soarstarter.com.devsoar-starter-expo-dev
PreviewSoar Starter (Preview)expo.soarstarter.com.previewsoar-starter-expo-preview
ProductionSoar Starterexpo.soarstarter.comsoar-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_AUTHSupabase Edge Function secret
可选 send-test-push 的 APNs keysSupabase Edge Function secrets
SENTRY_AUTH_TOKENEAS 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 对应:

ChannelBuild profile用途
developmentdevelopmentdev client 开发测试
previewpreview内部 QA 更新
productionproduction商店包更新

向匹配的 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。 商店侧准备请看 商店发布

相关页面

On this page