Instalar, configurar e integrar o Pacote de emuladores locais

O Pacote de emuladores locais do Firebase pode ser instalado e configurado para diferentes ambientes de prototipagem e teste, desde sessões de prototipagem até fluxos de trabalho de integração contínua em escala de produção.

Instalar o Pacote de emuladores locais

Antes de instalar o Pacote de emuladores, você vai precisar do:

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

Para instalar o Pacote de emuladores, siga as etapas a seguir:

  1. Instale a CLI Firebase. Se você ainda não instalou a CLI do Firebase, faça a instalação agora mesmo. Você vai precisar da CLI versão 8.14.0 ou posterior para usar o Pacote de emuladores. É possível verificar qual versão está instalada usando o seguinte comando:
    firebase --version
  2. Se ainda não tiver 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. Configurar o Pacote de emuladores. Este comando inicia um assistente de configuração que permite selecionar emuladores do seu interesse, fazer o download dos arquivos binários do emulador correspondentes e definir as 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 a versão da CLI do Firebase.

Configurar o Pacote de emuladores

Como opção, 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.
  • Mude 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 ouvem nas portas padrão, e os emuladores de Cloud Firestore, Realtime Database e Cloud Storage for Firebase serão executados com segurança de dados aberta.

Comando Descrição
emuladores init 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 é destrutivo; se você aceitar os padrões, a configuração atual do emulador será preservada.

Configuração da porta

Cada emulador é vinculado a uma porta diferente na sua máquina com um valor padrão preferido.

Emulador Porta padrão
Authentication 9099
App Hosting 5002
Emulator Suite UI 4000
Cloud Functions 5001
Eventarc 9299
Realtime Database 9000
Cloud Firestore 8080
Cloud Storage for Firebase 9199
Firebase Hosting 5000
Pub/Sub 8085

Configuração do ID do projeto

Dependendo de como você invoca emuladores, é possível executar várias instâncias de um emulador usando diferentes IDs do projeto do Firebase ou várias instâncias de emulador para um determinado ID do projeto. Nesses casos, as instâncias do emulador estão em execução em um ambiente separado.

Geralmente, é recomendável definir um ID do projeto para todas as invocações do emulador. Assim, o Emulator Suite UI, os diferentes emuladores de produtos e todas as instâncias em execução de um determinado emulador podem se comunicar corretamente em todos os casos.

Local Emulator Suite emite avisos ao detectar vários IDs de projeto em ambiente, embora seja possível substituir esse comportamento definindo a chave singleProjectMode como false no firebase.json.

Verifique as declarações do ID do projeto para ver se há incompatibilidades nos seguintes locais:

  • O projeto padrão na linha de comando. Por padrão, o ID do projeto será inicializado no projeto selecionado com firebase init ou firebase use. Para ver a lista de projetos (e qual deles está selecionado) use firebase projects:list.
  • Testes de unidade de regras. O ID do projeto geralmente é especificado em chamadas para os métodos da biblioteca de teste de unidade de regras initializeTestEnvironment ou initializeTestApp.
  • A sinalização de linha de comando --project. Transmitir a flag --project da CLI do Firebase modifica o projeto padrão. Você precisará garantir que o valor da sinalização corresponda ao ID do projeto em testes de unidade e na inicialização do app.

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

Configuração das regras de segurança

Os emuladores utilizarão a configuração das regras de segurança das chaves de configuração database, 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"
    }
  }
}

Como especificar opções do Java

O emulador de Realtime Database, o emulador de Cloud Firestore e parte do emulador de Cloud Storage for Firebase são baseados em Java. Por isso, eles podem ser personalizados com sinalizações JVM usando a variável de ambiente JAVA_TOOL_OPTIONS.

Por exemplo, se ocorrer um erro relacionado ao espaço de heap do Java, será possível aumentar o tamanho máximo para 4 GB:

export JAVA_TOOL_OPTIONS="-Xmx4g"
firebase emulators:start

Várias sinalizações podem ser especificadas entre aspas separadas por espaços, como JAVA_TOOL_OPTIONS="-Xms2g -Xmx4g". As flags afetam apenas os componentes baseados em Java dos emuladores e não outras partes da CLI do Firebase, como Emulator Suite UI.

Iniciar emuladores

É possível iniciar os emuladores para serem executados até serem encerrados manualmente ou para serem executados durante um script de teste designado e depois encerrados automaticamente.

Comando Descrição
emulators:start Inicie emuladores para os produtos do Firebase configurados em firebase.json. Os processos do emulador continuarão em execução até serem explicitamente interrompidos. Chame emulators:start para fazer o download dos emuladores em ~/.cache/firebase/emulators/ se eles ainda não estiverem instalados.
Sinalizar Descrição
--only Opcional. Limite quais emuladores serão iniciados. Forneça uma lista separada por vírgulas de nomes de emulador, 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 essa flag é fornecida, o emulador do Cloud Functions alterna para um modo de execução serializado especial em que as funções são executadas em um único processo, em ordem sequencial (FIFO, na sigla em inglês). Isso simplifica a depuração de funções, embora o comportamento seja diferente da execução paralela de vários processos na nuvem.
--export-on-exit= Opcional. Use com emulador de Authentication, Cloud Firestore, Realtime Database ou Cloud Storage for Firebase. Instrua os emuladores a exportar dados para um diretório quando a interrupção ocorrer, conforme descrito para o comando emulators:export. O diretório de exportação pode ser especificado com esta flag: 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 fim, você pode transmitir caminhos de diretório diferentes para as flags --import e --export-on-exit.
--import=import_directory Opcional. Use com emulador de Authentication, Cloud Firestore, Realtime Database ou Cloud Storage for Firebase. Importe dados salvos usando a opção de inicialização do --export-on-exit ou o comando do emulators:export para executar Authentication, Cloud Firestore, Realtime Database ou uma instância do emulador do Cloud Storage for Firebase. Todos os dados atualmente na memória do emulador serão substituídos.
emulators:exec scriptpath Execute o script em scriptpath depois de iniciar emuladores para os produtos do Firebase configurados em firebase.json. Os processos do emulador serão interrompidos automaticamente quando a execução do script for concluída.
Sinalizar Descrição
--only Opcional. Limite quais emuladores serão iniciados. Forneça uma lista separada por vírgulas de nomes de emulador, especificando um ou mais de "firestore", "database", "functions", "host" 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 essa flag é fornecida, o emulador do Cloud Functions alterna para um modo de execução serializado especial em que as funções são executadas em um único processo, em ordem sequencial (FIFO, na sigla em inglês). Isso simplifica a depuração de funções, embora o comportamento seja diferente da execução paralela de vários processos na nuvem.
--export-on-exit= Opcional. Use com emulador de Authentication, Cloud Firestore, Realtime Database ou Cloud Storage for Firebase. Instrua os emuladores a exportar dados para um diretório quando a interrupção ocorrer, conforme descrito para o comando emulators:export. O diretório de exportação pode ser especificado com esta flag: 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 fim, você pode transmitir caminhos de diretório diferentes para as flags --import e --export-on-exit.
--import=import_directory Opcional. Use com emulador de Authentication, Cloud Firestore, Realtime Database ou Cloud Storage for Firebase. Importe dados salvos usando a opção de inicialização do --export-on-exit ou o comando do emulators:export para executar Authentication, Cloud Firestore, Realtime Database ou uma instância do emulador do Cloud Storage for Firebase. Todos os 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

É possível exportar dados dos emuladores de Authentication, Cloud Firestore, Realtime Database e Cloud Storage for Firebase para serem usados como um conjunto de dados de referência comum e compartilhável. Esses conjuntos de dados podem ser importados usando a flag --import, conforme descrito acima.

emulators:export export_directory

Emulador de Authentication, Cloud Firestore, Realtime Database ou Cloud Storage for Firebase. Exportar dados de uma instância de emulador de Cloud Firestore, Realtime Database ou Cloud Storage for Firebase em execução. Se não existir, o diretório export_directory especificado será criado. Se existir, confirme que os dados de exportação anteriores devem ser substituídos. Para ignorar esse prompt, use a flag --force. O diretório de exportação contém um arquivo de manifesto de dados, firebase-export-metadata.json.

Instrua os emuladores a exportar dados automaticamente quando forem desligados usando as sinalizações --export-on-exit descritas acima.

Integrar com o sistema de CI

Como executar imagens conteinerizadas do Pacote de emuladores

É simples instalar e configurar o Pacote de emuladores com contêineres em uma configuração de CI típica.

Fique atento a alguns problemas:

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

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

Gerar um token de autenticação (somente emulador do Hosting)

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

Para gerar um token, execute firebase login:ci no ambiente local. Isso não deve ser realizado em um sistema de CI. Siga as instruções para fazer a autenticação. Você só precisa fazer essa etapa uma vez por projeto, já que o token vai ser válido entre os builds. O token deve ser tratado como uma senha. Mantenha-o em segredo.

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

Como último recurso, você pode simplesmente incluir o token no script de build, mas garanta que as partes não confiáveis não tenham acesso. Para esse método codificado, adicione --token "YOUR_TOKEN_STRING_HERE" ao comando firebase emulators:exec.

Usar a API REST do emulador Hub

Listar emuladores em execução

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

curl localhost:4400/emulators

O resultado será um objeto JSON listando todos os emuladores em execução e a configuração de host/porta deles, 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ções de segundo plano

Em algumas situações, será necessário desativar temporariamente os gatilhos de funções e extensões locais. Por exemplo, talvez você queira excluir todos os dados no emulador de Cloud Firestore sem acionar nenhuma função onDelete em execução nos emuladores de Cloud Functions ou Extensions.

Para desativar temporariamente os gatilhos de funções locais, envie uma solicitação PUT ao endpoint /functions/disableBackgroundTriggers do Hub do emulador.

curl -X PUT localhost:4400/functions/disableBackgroundTriggers

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

{
  "enabled": false
}

Para ativar os acionadores de funções locais depois da desativação, envie uma solicitação PUT para o endpoint /functions/enableBackgroundTriggers do Hub do emulador.

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 administrador. Futuro significa que a compatibilidade com o emulador está planejada, mas ainda não está disponível.

Disponibilidade do SDK do cliente

Android Plataformas da Apple Web IU do Firebase
Android
IU do Firebase
iOS
IU do Firebase
Web
Realtime Database 19.4.0 7.2.0 8.0.0 6.4.0 Futuro N/A
Cloud Firestore 21.6.0 7.2.0 8.0.0 6.4.0 Futuro N/A
Authentication 20.0.0 7.0.0 8.0.0 7.0.0 Futuro 4.7.2
Cloud Storage for Firebase 20.0.0 8.0.0 8.4.0 7.0.0 11.0.0 N/A
Cloud Functions 19.1.0 7.2.0 8.0.0 N/A N/A N/A
Hosting N/A N/A N/A N/A N/A N/A
Extensions N/A N/A N/A N/A N/A N/A

Disponibilidade do SDK Admin

Node Java Python Go
Realtime Database 8.6.0 6.10.0 2.18.0 Futuro
Cloud Firestore 8.0.0 6.10.0 3.0.0 1.0.0
Authentication 9.3.0 7.2.0 5.0.0 4.2.0
Cloud Storage for Firebase 9.8.0 Futuro Futuro Futuro
Cloud Functions N/A N/A N/A N/A
Hosting N/A N/A N/A N/A
Extensions N/A N/A N/A N/A