-
Verifique scripts no repositório: Coloque o bash de scripts/ci/ sob controle de versão - laptops, GitHub Actions e hooks do EAS executam os mesmos pontos de entrada, não trechos únicos do Slack.
-
Use npx para CLIs Expo e EAS: npx expo-doctor e npx eas-cli@latest evitam desvios de versão globais entre colegas de equipe e imagens de CI.
-
Padronize em npm ci na automação: Instalações baseadas em lockfile na CI; npm install apenas em branches de recursos locais quando atualizando dependências intencionalmente.
-
Execute npx expo-doctor antes do trabalho nativo: Detecta desvios de versão do SDK 57 antes que expo run:* ou eas build desperdicem vinte minutos em CocoaPods ou Gradle.
-
Combine expo start --dev-client com builds de desenvolvimento: Shells nativos personalizados precisam da flag Metro do dev-client - expo start simples visa a semântica do Expo Go.
-
Limpe o Metro com intenção: npx expo start --clear após atualizações de dependência; não o aliase para cada salvamento - ele esconde bugs do bundler.
-
Reserve expo prebuild para alterações nativas: Plugins de configuração, entitlements e novos módulos nativos - não cada commit JS sob CNG.
-
Espelhe portões de CI localmente: npm run lint && npx tsc --noEmit && npm test -- --ci antes de eas build --non-interactive - mesmos comandos, mesma superfície de falha.
-
Exporte EXPO_TOKEN apenas na CI: Tokens de robô em GitHub Secrets / EAS - nunca comite; verifique com eas whoami em um trabalho de dry-run.
-
Analise eas build:list --json: Use jq para URLs de artefatos - tabelas humanas não são legíveis por máquina e quebram quando a formatação da CLI muda.
-
Falhe fechado com jq -er: Campos JSON obrigatórios devem sair com código não zero quando ausentes - evita que curl baixe páginas de erro HTML como "APKs".
-
Use rg para triagem de logs: Ripgrep JSONL e logs EAS com globs -g - mais rápido que grep -R e respeita .gitignore.
-
Resolva UDIDs de simuladores iOS em scripts: Nomes de dispositivos colidem entre versões do Xcode - xcrun simctl list devices available -j | jq é estável.
-
Inicie simuladores antes de simctl install: O alias booted não visa nada quando o Simulador está desligado - simctl boot e depois instale.
-
Tire screenshots com simctl io para evidências: Artefatos PNG para PRs, baselines do Maestro e anexos da App Store - reproduzíveis sem a UI do Xcode.
-
Defina ANDROID_HOME e JDK 17 explicitamente: RN 0.86 Gradle espera JDK 17 - documente os caminhos em README e blocos de ambiente de CI.
-
adb reverse tcp:8081 em Android USB: Dispositivos físicos não alcançam localhost do laptop sem reverso - faça isso após cada reconexão de cabo.
-
Sufixe adb -s SERIAL com múltiplos dispositivos: Emulador mais telefone causam erros de alvo ambíguos - enumere com adb devices -l.
-
Filtre logcat agressivamente: '*:S'ReactNativeJS:V AndroidRuntime:E expõe erros JS e nativos fatais sem spam do sistema.
-
Instale APKs com adb install -r: Reinstale clientes de desenvolvimento do EAS ou assembleDebug sem Android Studio - verifique se android.package corresponde.
-
Prefira Metro LAN; use túnel como fallback: --tunnel é mais lento - use adb reverse USB ou Wi-Fi compartilhado antes de recorrer ao túnel.
-
Encadeie comandos com && em scripts: set -euo pipefail mais portões explícitos - falhe rápido como CI, não sucesso parcial silencioso.
-
Armazene filtros jq ao lado de fluxos de trabalho: scripts/jq/latest-apk.jq revisado em PRs - não linhas únicas duplicadas em três arquivos YAML.
-
CI Linux para Android; macOS para simctl iOS: Não finja que simctl roda em ubuntu-latest - divida trabalhos por capacidade de plataforma.
-
Leia documentação de plataforma cruzada quando a CLI não for suficiente: Assinatura, entitlements e trilhas do Play ficam em EAS Build, Plataforma iOS e Plataforma Android - a CLI limpa o atrito do desenvolvimento, não a política da loja.
Versões de Stack: Esta página foi escrita para React 19.2.3, React Native 0.86.0 e Expo SDK 57 (expo ~57.0.4).