Perfis e Flavors de Build
Variantes de desenvolvimento, preview, produção e white-label - o guia para estruturar perfis do eas.json e app.config.ts dinâmico no Expo SDK 57.
Busque em todas as páginas da documentação
Variantes de desenvolvimento, preview, produção e white-label - o guia para estruturar perfis do eas.json e app.config.ts dinâmico no Expo SDK 57.
Cartão de receita de referência rápida - pronto para copiar e colar.
// eas.json - base de três ambientes
{
"cli": { "version": ">= 16.0.0", "appVersionSource": "remote" },
"build": {
"development": {
"developmentClient": true,
"distribution": "internal",
"environment": "development",
"channel": "development"
},
"preview": {
"distribution": "internal",
"environment": "preview",
"channel": "preview"
},
"production": {
"distribution": "store",
"environment": "production",
"channel": "production",
"autoIncrement": true
}
}
}// app.config.ts - APP_VARIANT do env do eas.json
import type { ExpoConfig } from "expo/config";
const variant = process.env.APP_VARIANT ?? "production";
const bundleIds: Record<string, string> = {
development: "com.example.shopapp.dev",
preview: "com.example.shopapp.staging",
production: "com.example.shopapp",
};
const config: ExpoConfig = {
name: variant === "production" ? "Shop" : `Shop (${variant})`,
slug: "shop-app",
ios: { bundleIdentifier: bundleIds[variant] },
android: { package: bundleIds[variant] },
extra: {
apiUrl: process.env.EXPO_PUBLIC_API_URL,
eas: { projectId: "00000000-0000-0000-0000-000000000000" },
},
};
export default config;// eas.json - passa a variante para o prebuild
{
"build": {
"preview": {
"env": { "APP_VARIANT": "preview" },
"environment": "preview"
}
}
}Quando usar isso:
Passo 1 - Defina as responsabilidades do perfil
| Perfil | Público | Distribuição | Binário Típico |
|---|---|---|---|
| development | Engenheiros | internal | Cliente Dev + simulador/APK |
| preview | QA / stakeholders | internal | IPA/APK com formato de release |
| production | Usuários Finais | store | AAB + App Store IPA |
eas build --profile development --platform all
eas build --profile preview --platform ios
eas build --profile production --platform androidPasso 2 - Vincule ambientes EAS
Crie variáveis no painel Expo → Project → Environment variables:
development EXPO_PUBLIC_API_URL=https://api.dev.example.com
preview EXPO_PUBLIC_API_URL=https://api.staging.example.com
production EXPO_PUBLIC_API_URL=https://api.example.com{
"build": {
"preview": { "environment": "preview" }
}
}environment puxa variáveis do EAS - não do .env.local do laptopeas update --environment production deve corresponder ao perfil de produção - Regras de Release e OTAPasso 3 - White-label com app.config.ts
// app.config.ts - multi-marca a partir do env BRAND
type Brand = "acme" | "contoso";
const brand = (process.env.BRAND ?? "acme") as Brand;
const brands: Record<Brand, { name: string; bundleId: string; icon: string }> = {
acme: {
name: "Acme Shop",
bundleId: "com.acme.shop",
icon: "./brands/acme/icon.png",
},
contoso: {
name: "Contoso Market",
bundleId: "com.contoso.market",
icon: "./brands/contoso/icon.png",
},
};
const config: ExpoConfig = {
name: brands[brand].name,
slug: `shop-${brand}`,
icon: brands[brand].icon,
ios: { bundleIdentifier: brands[brand].bundleId },
android: {
package: brands[brand].bundleId,
adaptiveIcon: { foregroundImage: brands[brand].icon, backgroundColor: "#fff" },
},
};
export default config;// eas.json - um perfil por marca para produção
{
"build": {
"production-acme": {
"extends": "production",
"env": { "BRAND": "acme" },
"environment": "production-acme"
},
"production-contoso": {
"extends": "production",
"env": { "BRAND": "contoso" },
"environment": "production-contoso"
}
}
}eas build --profile production-acme --platform all
eas build --profile production-contoso --platform allprojectId separado ou isolamento rigoroso de canal por ID de bundlebundleIdentifier / packageDRY configurações compartilhadas entre perfis:
{
"build": {
"base": {
"node": "22.11.0",
"resourceClass": "medium"
},
"development": {
"extends": "base",
"developmentClient": true,
"distribution": "internal"
},
"production": {
"extends": "base",
"distribution": "store",
"autoIncrement": true
},
"production-ios-simulator": {
"extends": "production",
"ios": { "simulator": true },
"distribution": "internal"
}
}
}extends mescla chaves pai - as do filho têm precedênciaO Expo CNG geralmente usa um único Gradle applicationId por prebuild, controlado por app.config.ts:
eas.json profile → APP_VARIANT env → app.config.ts → applicationIdFlavors de produto nativos do Android em build.gradle são possíveis em projetos brownfield, mas entram em conflito com a regeneração do CNG. Prefira:
app.config.ts dinâmico para ID do bundle, nome e íconesVeja Noções Básicas de Prebuild - flavors de produto android/app/build.gradle editados manualmente são perdidos em um prebuild limpo.
// app.config.ts
runtimeVersion: {
policy: "fingerprint",
},
updates: {
url: "https://u.expo.dev/<project-id>",
},{
"build": {
"preview": { "channel": "preview" },
"production": { "channel": "production" }
}
}eas update --channel preview --environment preview --message "Correção de QA"
eas update --channel production --environment production --message "Hotfix"eas updatebundleIdentifier / package forem diferentes - use sufixos APP_VARIANT como .dev e .staging.extends quando necessário."jane-debug") - use ambientes e canais em vez disso.BRAND + credenciais separadas por nome de pacote.Versões da Stack: Esta página foi escrita para React 19.2.3, React Native 0.86.0 e Expo SDK 57 (
expo~57.0.4).
Revisado por Chris St. John·Última atualização: 19 de jul. de 2026