Categorías
Angular Cloud Dev Firebase TypeScript

Cómo utilizar el emulador de Firebase sin sufrir en el intento

Este post tiene como origen divertidos problemas que hemos tenido. Recomendamos solo habilitar los Emuladores necesarios. Hemos tenido algunos líos, en especial con el Emulador Pub/Sub.

Para comenzar, es necesario tener instalado Node.js 10.13 o mayor y verificar que se tiene la última versión de firebase-tools con el siguiente comando:

npm install -g firebase-tools

Asumiendo que firebase ya está corriendo y funcionando, entonces lo siguiente es inicializar el emulador:

$ firebase init emulators

     ######## #### ########  ######## ########     ###     ######  ########
     ##        ##  ##     ## ##       ##     ##  ##   ##  ##       ##
     ######    ##  ########  ######   ########  #########  ######  ######
     ##        ##  ##    ##  ##       ##     ## ##     ##       ## ##
     ##       #### ##     ## ######## ########  ##     ##  ######  ########

You're about to initialize a Firebase project in this directory:

  D:\angular\magenta

Before we get started, keep in mind:

  * You are initializing in an existing Firebase project directory

? Are you ready to proceed? Yes

=== Project Setup

First, let's associate this project directory with a Firebase project.
You can create multiple project aliases by running firebase use --add,
but for now we'll just set up a default project.

i  .firebaserc already has a default project, using magenta-dev-46fe2.

=== Emulators Setup
? Which Firebase emulators do you want to set up? Press Space to select emulators, then Enter to confirm your choices. Authentication Emulator, Functions Emulator, Firestore Emulator, Hosting Emulator, Pub/Sub Emulator
? Which port do you want to use for the auth emulator? 9099     
i  Port for functions already configured: 5001
i  Port for firestore already configured: 8080
i  Port for hosting already configured: 5000
? Which port do you want to use for the pubsub emulator? 8085
i  Emulator UI already enabled with port: (automatic)        
? Would you like to download the emulators now? Yes
i  pubsub: downloading pubsub-emulator-0.1.0.zip...
Progress: ===================================================================================================================================> (100% of 37MB) 

i  Writing configuration info to firebase.json...
i  Writing project information to .firebaserc...

+  Firebase initialization complete!

Nótese que esta parte es interactiva y será necesario seleccionar los emuladores que se quieren utilizar y seleccionar los puertos. Una vez hecho esto

Cómo iniciar el Emulador de Firebase

Los siguientes comandos le permitirán iniciar el emulador:

firebase emulators:start

Para guardar los datos que se creen al terminar el emulador, utilizar:

firebase emulators:start --export-on-exit=emulator-data

Para cargar los datos guardados al iniciar el emulador, utilizar:

firebase emulators:start --import=emulator-data

Para cargar los datos al iniciar y guardar al terminar:

firebase emulators:start --import=emulator-data --export-on-exit=emulator-data

Cómo detener el depurador

El depurador se detiene con el clásico Ctrl + C, pero esto a veces deja bloqueado un puerto, generalmente el 8080, lo que luego no permite reinicar el depurador. Para resolverlo se puede instalar el paquete kill-port:

npm install --global kill-port

Con esto se podrá liberar el puerto con el siguiente comando:

kill-port 8080

Cómo depurar paso a paso con Visual Studio Code

Para esto es necesario configurar el archivo .vscode/launch.json y agregar la configuración para depurar así:

{
  "version": "0.2.0",
  "configurations": [
    {
      ...
    },
    {
      "type": "node",
      "request": "attach",
      "name": "Debug Functions",
      "port": 9229
    }
  ]
}

Con esto, ya es posible ejecutar el Emulador para que permita depuración paso a paso y agregar puntos de interrupción:

firebase emulators:start --inspect-functions

Agregando las banderas para que se importen y exporten los datos, la cosa quedaría como así:

firebase emulators:start --import=emulator-data --export-on-exit=emulator-data --inspect-functions

La Ñapa

Es posible configurar el proyecto que el comando npm run cbuild refresque todo el código generado en /lib. Para esto instalar rimraf:

npm install -D rimraf

Luego ajustar el archivo package.json, agregando el script cbuild:

{
  "name": "functions",
  "scripts": {
    "lint": "tslint --project tsconfig.json",
    "build": "tsc",
    "cbuild": "rimraf lib/ && tsc",
    "serve": "npm run build && firebase serve --only 
    ...
  },
  ...
}

Hecho esto, se podrá correr el comando:

npm run cbuild

Que limpiará cualquier código existente en el folder lib y hara el build nuevamente, así el emulador funcionará con los últimos cambios.

La documentación oficial del Emulador de Firebase está disponible aquí: https://firebase.google.com/docs/emulator-suite?hl=es

Deja una respuesta