Instalar, configurar e integrar o Local Emulator Suite

O Firebase Local Emulator Suite pode ser instalado e configurado para diferentes protótipos e ambientes de teste, desde sessões únicas de prototipagem até fluxos de trabalho de integração contínua em escala de produção.

Instale o conjunto de emuladores locais

Antes de instalar o Emulator Suite você precisará de:

  • Node.js versão 16.0 ou superior.
  • Java JDK versão 11 ou superior.

Para instalar o pacote de emuladores:

  1. Instale a CLI do Firebase . Se você ainda não tem a CLI do Firebase instalada, instale-a agora . Você precisará da CLI versão 8.14.0 ou superior para usar o Emulator Suite. Você pode verificar qual versão você instalou usando o seguinte comando:
    firebase --version
  2. Caso ainda não tenha feito isso, inicialize o diretório de trabalho atual como um projeto do Firebase, seguindo as instruções na tela para especificar quais produtos usar:
    firebase init
  3. Configure o pacote de emuladores. Este comando inicia um assistente de configuração que permite selecionar emuladores de interesse, fazer download dos arquivos binários do emulador correspondentes e definir portas do emulador se os padrões não forem apropriados.
    firebase init emulators

Depois que um emulador for instalado, nenhuma verificação de atualização será realizada e nenhum download automático adicional ocorrerá até que você atualize sua versão da CLI do Firebase.

Configurar pacote de emuladores

Opcionalmente, você pode configurar as portas de rede dos emuladores e o caminho para as definições de regras de segurança no arquivo firebase.json :

  • Altere as portas do emulador executando firebase init emulators ou editando firebase.json manualmente.
  • Altere o caminho para as definições de regras de segurança editando firebase.json manualmente.

Se você não definir essas configurações, os emuladores escutarão nas portas padrão, e os emuladores Cloud Firestore, Realtime Database e Cloud Storage for Firebase serão executados com segurança de dados aberta.

Comando Descrição
emuladores de inicialização Inicie um assistente de inicialização do emulador. Identifique os emuladores a serem instalados e, opcionalmente, especifique as configurações da porta do emulador. init emulators não são destrutivos; aceitar padrões preservará a configuração atual do emulador.

Configuração de porta

Cada emulador se liga a uma porta diferente em sua máquina com um valor padrão preferencial.

Emulador Porta padrão
Autenticação 9099
IU do pacote de emuladores 4000
Funções de nuvem 5001
Eventarc 9299
Banco de dados em tempo real 9.000
Cloud Firestore 8080
Armazenamento em nuvem para Firebase 9199
Hospedagem Firebase 5.000
Pub/Sub 8085

Configuração do ID do projeto

Dependendo de como você invoca emuladores, você pode executar várias instâncias de um emulador usando diferentes IDs de projeto do Firebase ou várias instâncias de emulador para um determinado ID de projeto. Nesses casos, as instâncias do emulador são executadas em um ambiente separado.

Geralmente, é uma boa prática definir um ID de projeto para todas as invocações do emulador, para que a UI do Emulator Suite, diferentes emuladores de produtos e todas as instâncias em execução de um emulador específico possam se comunicar corretamente em todos os casos.

O Local Emulator Suite emite avisos quando detecta vários IDs de projeto no ambiente, embora você possa substituir esse comportamento definindo a chave singleProjectMode como false em seu firebase.json .

Você pode verificar se há incompatibilidades nas declarações de ID do projeto em:

  • O projeto padrão na linha de comando. Por padrão, o ID do projeto será obtido na inicialização do projeto selecionado com firebase init ou firebase use . Para visualizar a lista de projetos (e ver qual deles está selecionado) use firebase projects:list .
  • Regras de testes unitários. O ID do projeto geralmente é especificado em chamadas para os métodos da biblioteca de testes de unidade de regras initializeTestEnvironment ou initializeTestApp .
  • O sinalizador --project da linha de comando. Passar a sinalização --project CLI do Firebase substitui o projeto padrão. Você precisará garantir que o valor do sinalizador corresponda ao ID do projeto nos testes de unidade e na inicialização do aplicativo.

Verifique também as configurações de ID do projeto específicas da plataforma que você definiu ao configurar suas plataformas Apple , Android e projetos da Web .

Configuração de regras de segurança

Os emuladores usarão a configuração das regras de segurança do database , das chaves de configuração firestore e storage em firebase.json .

{
  // Existing firebase configuration ...
  "database": {
    "rules": "database.rules.json"
  },
  "firestore": {
    "rules": "firestore.rules"
  },
  "storage": {
    "rules": "storage.rules"
  }

  // ...

  // Optional emulator configuration. Default
  // values are used if absent.
  "emulators": {
    "singleProjectMode": false, // do not warn on detection of multiple project IDs
    "firestore": {
      "port": "8080"
    },
    "ui": {
      "enabled": true,      // Default is `true`
      "port": 4000          // If unspecified, see CLI log for selected port
    },
    "auth": {
      "port": "9099"
    },
    "pubsub": {
      "port": "8085"
    }
  }
}

Especificando opções Java

O emulador do Realtime Database, do Cloud Firestore e parte do emulador do Cloud Storage for Firebase são baseados em Java, que pode ser personalizado com sinalizadores JVM por meio da variável de ambiente JAVA_TOOL_OPTIONS .

Por exemplo, se você tiver erros relacionados ao espaço de heap Java, poderá aumentar o tamanho máximo de heap Java para 4 GB:

export JAVA_TOOL_OPTIONS="-Xmx4g"
firebase emulators:start

Vários sinalizadores podem ser especificados entre aspas separadas por espaços, como JAVA_TOOL_OPTIONS="-Xms2g -Xmx4g" . As sinalizações afetam apenas os componentes baseados em Java dos emuladores e não têm efeito em outras partes da CLI do Firebase, como a IU do Emulator Suite.

Inicialize emuladores

Você pode iniciar os emuladores para serem executados até serem encerrados manualmente ou para serem executados durante um script de teste designado e depois serem desligados automaticamente.

Comando Descrição
emuladores: iniciar Inicie emuladores para os produtos Firebase configurados em firebase.json . Os processos do emulador continuarão em execução até serem explicitamente interrompidos. Chamar emulators:start fará o download dos emuladores para ~/.cache/firebase/emulators/ se eles ainda não estiverem instalados.
Bandeira Descrição
--only Opcional. Limite quais emuladores são iniciados. Forneça uma lista de nomes de emuladores separados por vírgula, especificando um ou mais de 'auth', 'database', 'firestore', 'functions', 'hosting' ou 'pubsub'.
--inspect-functions debug_port Opcional. Use com o emulador do Cloud Functions para ativar a depuração de ponto de interrupção de funções na porta especificada (ou na porta padrão 9229 se o argumento for omitido). Observe que quando esse sinalizador é fornecido, o emulador do Cloud Functions alterna para um modo de execução serializado especial no qual as funções são executadas em um único processo, em ordem sequencial (FIFO). isso simplifica a depuração de funções, embora o comportamento seja diferente da execução paralela e multiprocessada de funções na nuvem.
--export-on-exit= Opcional. Use com o emulador Authentication, Cloud Firestore, Realtime Database ou Cloud Storage for Firebase. Instrua o(s) emulador(es) a exportar dados para um diretório quando ocorrer o encerramento, conforme descrito para o comando emulators:export . O diretório de exportação pode ser especificado com este sinalizador: firebase emulators:start --export-on-exit=./saved-data . Se --import for usado, o caminho de exportação será o mesmo; por exemplo: firebase emulators:start --import=./data-path --export-on-exit . Por último, se desejar, passe caminhos de diretório diferentes para os sinalizadores --import e --export-on-exit .
--import= import_directory Opcional. Use com o emulador Authentication, Cloud Firestore, Realtime Database ou Cloud Storage for Firebase. Importe dados salvos usando a opção de inicialização --export-on-exit ou o comando emulators:export para uma instância de emulador em execução do Authentication, Cloud Firestore, Realtime Database ou Cloud Storage for Firebase. Quaisquer dados atualmente na memória do emulador serão ignorados.
emuladores:exec scriptpath Execute o script em scriptpath após iniciar emuladores para os produtos Firebase configurados em firebase.json . Os processos do emulador serão interrompidos automaticamente quando a execução do script terminar.
Bandeira Descrição
--only Opcional. Limite quais emuladores são iniciados. Forneça uma lista separada por vírgulas de nomes de emuladores, especificando um ou mais de 'firestore', 'database', 'functions', 'hosting' ou 'pubsub'.
--inspect-functions debug_port Opcional. Use com o emulador do Cloud Functions para ativar a depuração de ponto de interrupção de funções na porta especificada (ou na porta padrão 9229 se o argumento for omitido). Observe que quando esse sinalizador é fornecido, o emulador do Cloud Functions alterna para um modo de execução serializado especial no qual as funções são executadas em um único processo, em ordem sequencial (FIFO). isso simplifica a depuração de funções, embora o comportamento seja diferente da execução paralela e multiprocessada de funções na nuvem.
--export-on-exit= Opcional. Use com o emulador Authentication, Cloud Firestore, Realtime Database ou Cloud Storage for Firebase. Instrua o(s) emulador(es) a exportar dados para um diretório quando ocorrer o encerramento, conforme descrito para o comando emulators:export . O diretório de exportação pode ser especificado com este sinalizador: firebase emulators:start --export-on-exit=./saved-data . Se --import for usado, o caminho de exportação será o mesmo; por exemplo: firebase emulators:start --import=./data-path --export-on-exit . Por último, se desejar, passe caminhos de diretório diferentes para os sinalizadores --import e --export-on-exit .
--import= import_directory Opcional. Use com o emulador Authentication, Cloud Firestore, Realtime Database ou Cloud Storage for Firebase. Importe dados salvos usando a opção de inicialização --export-on-exit ou o comando emulators:export para uma instância de emulador em execução do Authentication, Cloud Firestore, Realtime Database ou Cloud Storage for Firebase. Quaisquer dados atualmente na memória do emulador serão substituídos.
--ui Opcional. Execute a IU do emulador durante a execução.

O método firebase emulators:exec geralmente é mais apropriado para fluxos de trabalho de integração contínua.

Exportar e importar dados do emulador

Você pode exportar dados dos emuladores Authentication, Cloud Firestore, Realtime Database e Cloud Storage for Firebase para usar como um conjunto de dados de linha de base comum e compartilhável. Esses conjuntos de dados podem ser importados usando o sinalizador --import , conforme descrito acima.

emuladores: exportar export_directory

Autenticação, Cloud Firestore, Realtime Database ou Cloud Storage para emulador Firebase . Exporte dados de uma instância de emulador do Cloud Firestore, do Realtime Database ou do Cloud Storage for Firebase em execução. O export_directory especificado será criado se ainda não existir. Se o diretório especificado existir, você será solicitado a confirmar se os dados de exportação anteriores devem ser substituídos. Você pode pular este prompt usando o sinalizador --force . O diretório de exportação contém um arquivo de manifesto de dados, firebase-export-metadata.json .

Você pode instruir os emuladores a exportar dados automaticamente quando eles desligarem usando os sinalizadores --export-on-exit descritos acima.

Integre-se ao seu sistema CI

Executando imagens contêinerizadas do Emulator Suite

A instalação e configuração do Emulator Suite com contêineres em uma configuração típica de CI é simples.

Existem algumas questões a serem observadas:

  • Os arquivos JAR são instalados e armazenados em cache em ~/.cache/firebase/emulators/ .

    • Talvez você queira adicionar esse caminho à configuração do cache do CI para evitar downloads repetidos.
  • Se você não tiver um arquivo firebase.json em seu repositório, deverá adicionar um argumento de linha de comando ao comando emulators:start ou emulators:exec para especificar quais emuladores devem ser iniciados. Por exemplo,
    --only functions,firestore .

Gere um token de autenticação (somente emulador de hospedagem)

Se seus fluxos de trabalho de integração contínua dependem do Firebase Hosting , você precisará fazer login usando um token para executar firebase emulators:exec . Os demais emuladores não requerem login.

Para gerar um token, execute firebase login:ci em seu ambiente local; isso não deve ser realizado a partir de um sistema CI. Siga as instruções para autenticar. Você só precisará executar esta etapa uma vez por projeto, pois o token será válido em todos os builds. O token deve ser tratado como uma senha; certifique-se de que seja mantido em segredo.

Se o seu ambiente de CI permitir que você especifique variáveis ​​de ambiente que podem ser usadas nos scripts de construção, basta criar uma variável de ambiente chamada FIREBASE_TOKEN , com o valor sendo a string do token de acesso. A CLI do Firebase selecionará automaticamente a variável de ambiente FIREBASE_TOKEN e os emuladores serão iniciados corretamente.

Como último recurso, você pode simplesmente incluir o token em seu script de construção, mas certifique-se de que partes não confiáveis ​​não tenham acesso. Para esta abordagem codificada, você pode adicionar --token "YOUR_TOKEN_STRING_HERE" ao comando firebase emulators:exec .

Usar a API REST do Emulator Hub

Listar emuladores em execução

Para listar os emuladores em execução no momento, envie uma solicitação GET para o endpoint /emulators do Emulator Hub.

curl localhost:4400/emulators

O resultado será um objeto JSON listando todos os emuladores em execução e suas configurações de host/porta, por exemplo:

{
  "hub":{
    "name": "hub",
    "host": "localhost",
    "port": 4400
  },
  "functions": {
    "name": "functions",
    "host": "localhost",
    "port": 5001
  }
  "firestore": {
    "name": "firestore",
    "host": "localhost",
    "port": 8080
  }
}

Ativar/desativar gatilhos de função em segundo plano

Em algumas situações, você precisará desativar temporariamente a função local e os gatilhos de extensão. Por exemplo, você pode querer excluir todos os dados no emulador do Cloud Firestore sem acionar nenhuma função onDelete em execução nos emuladores do Cloud Functions ou Extensions.

Para desabilitar temporariamente os gatilhos de função local, envie uma solicitação PUT para o endpoint /functions/disableBackgroundTriggers do Emulator Hub.

curl -X PUT localhost:4400/functions/disableBackgroundTriggers

O resultado será um objeto JSON detalhando o estado atual.

{
  "enabled": false
}

Para habilitar gatilhos de função local depois de terem sido desabilitados, envie uma solicitação PUT para o endpoint /functions/enableBackgroundTriggers do Emulator Hub.

curl -X PUT localhost:4400/functions/enableBackgroundTriggers

O resultado será um objeto JSON detalhando o estado atual.

{
  "enabled": true
}

Integrações do SDK do emulador

As tabelas nesta seção indicam quais emuladores são compatíveis com SDKs de cliente e de administrador. Futuro significa que o suporte ao emulador está planejado, mas ainda não está disponível.

Disponibilidade do SDK do cliente

Android Plataformas Apple Rede IU do Firebase
Android
IU do Firebase
iOS
IU do Firebase
Rede
Banco de dados em tempo real 19.4.0 7.2.0 8.0.0 6.4.0 Futuro N / D
Cloud Firestore 21.6.0 7.2.0 8.0.0 6.4.0 Futuro N / D
Autenticação 20.0.0 7.0.0 8.0.0 7.0.0 Futuro 4.7.2
Armazenamento em nuvem para Firebase 20.0.0 8.0.0 8.4.0 7.0.0 11.0.0 N / D
Funções de nuvem 19.1.0 7.2.0 8.0.0 N / D N / D N / D
Hospedagem N / D N / D N / D N / D N / D N / D
Extensões N / D N / D N / D N / D N / D N / D

Disponibilidade do SDK Admin

Java Pitão Ir
Banco de dados em tempo real 8.6.0 6.10.0 2.18.0 Futuro
Cloud Firestore 8.0.0 6.10.0 3.0.0 1.0.0
Autenticação 9.3.0 7.2.0 5.0.0 4.2.0
Armazenamento em nuvem para Firebase 9.8.0 Futuro Futuro Futuro
Funções de nuvem N / D N / D N / D N / D
Hospedagem N / D N / D N / D N / D
Extensões N / D N / D N / D N / D