Firebase-tools: firebase serve: solo funciones no recarga en caliente

Creado en 1 may. 2018  ·  43Comentarios  ·  Fuente: firebase/firebase-tools

Información de la versión

firebase --version
3.18.4

Información de la plataforma

Ubuntu 18.04 x64

pasos para reproducir

  1. Proyecto de funciones en la nube de Firebase con TypeScript usando yarn
  2. construcción de hilo - reloj
  3. Ver una función HTTPS en el navegador
  4. Respuesta de la función de actualización
  5. Actualizar la página en el navegador

Comportamiento esperado

El navegador muestra contenido actualizado

Comportamiento real

La página solo se actualiza después de reiniciar el comando firebase serve. He confirmado que la salida en lib se ha actualizado.

> firebase serve --only functions --debug                                                                                                                                                             [17:29:27]
[2018-05-01T00:29:30.975Z] ----------------------------------------------------------------------
[2018-05-01T00:29:30.978Z] Command:       /home/shane/.nvm/versions/node/v6.11.5/bin/node /home/shane/.yarn/bin/firebase serve --only functions --debug
[2018-05-01T00:29:30.978Z] CLI Version:   3.18.4
[2018-05-01T00:29:30.979Z] Platform:      linux
[2018-05-01T00:29:30.979Z] Node Version:  v6.11.5
[2018-05-01T00:29:30.979Z] Time:          Mon Apr 30 2018 17:29:30 GMT-0700 (PDT)
[2018-05-01T00:29:30.979Z] ----------------------------------------------------------------------

[2018-05-01T00:29:30.986Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
[2018-05-01T00:29:30.986Z] > authorizing via signed-in user
[2018-05-01T00:29:30.988Z] >>> HTTP REQUEST GET https://admin.firebase.com/v1/projects/nativ-dev  

 Mon Apr 30 2018 17:29:30 GMT-0700 (PDT)
[2018-05-01T00:29:31.433Z] <<< HTTP RESPONSE 200 server=nginx, date=Tue, 01 May 2018 00:29:31 GMT, content-type=application/json; charset=utf-8, content-length=128, connection=close, x-content-type-options=nosniff, strict-transport-security=max-age=31536000; includeSubdomains, cache-control=no-cache, no-store
[2018-05-01T00:29:31.437Z] >>> HTTP REQUEST GET https://admin.firebase.com/v1/database/nativ-dev/tokens  

 Mon Apr 30 2018 17:29:31 GMT-0700 (PDT)
[2018-05-01T00:29:31.926Z] <<< HTTP RESPONSE 200 server=nginx, date=Tue, 01 May 2018 00:29:31 GMT, content-type=application/json; charset=utf-8, content-length=256, connection=close, x-content-type-options=nosniff, strict-transport-security=max-age=31536000; includeSubdomains, cache-control=no-cache, no-store
[2018-05-01T00:29:31.927Z] >>> HTTP REQUEST GET https://cloudresourcemanager.googleapis.com/v1/projects/nativ-dev  

 Mon Apr 30 2018 17:29:31 GMT-0700 (PDT)
[2018-05-01T00:29:32.335Z] <<< HTTP RESPONSE 200 content-type=application/json; charset=UTF-8, vary=X-Origin, Referer, Origin,Accept-Encoding, date=Tue, 01 May 2018 00:29:32 GMT, server=ESF, cache-control=private, x-xss-protection=1; mode=block, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=hq=":443"; ma=2592000; quic=51303433; quic=51303432; quic=51303431; quic=51303339; quic=51303335,quic=":443"; ma=2592000; v="43,42,41,39,35", accept-ranges=none, connection=close

=== Serving from '/home/shane/source/firebase'...

i  functions: Preparing to emulate functions.
[2018-05-01T00:29:32.733Z] Fetching environment
[2018-05-01T00:29:32.736Z] >>> HTTP REQUEST GET https://mobilesdk-pa.googleapis.com/v1/projects/766196581577:getServerAppConfig

 Mon Apr 30 2018 17:29:32 GMT-0700 (PDT)
[2018-05-01T00:29:33.255Z] <<< HTTP RESPONSE 200 content-type=application/json; charset=UTF-8, vary=X-Origin, Referer, Origin,Accept-Encoding, date=Tue, 01 May 2018 00:29:33 GMT, server=ESF, cache-control=private, x-xss-protection=1; mode=block, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=hq=":443"; ma=2592000; quic=51303433; quic=51303432; quic=51303431; quic=51303339; quic=51303335,quic=":443"; ma=2592000; v="43,42,41,39,35", accept-ranges=none, connection=close
[2018-05-01T00:29:33.256Z] Starting @google-cloud/functions-emulator
[2018-05-01T00:29:34.318Z] Parsing function triggers
i  functions: No HTTPS functions found. Use firebase functions:shell if you would like to emulate other types of functions.
i  functions: No HTTPS functions found. Use firebase functions:shell if you would like to emulate other types of functions.
✔  functions: createCustomerOnCall: http://localhost:5000/nativ-dev/us-central1/createCustomerOnCall
✔  functions: createCustomerHttps: http://localhost:5000/nativ-dev/us-central1/createCustomerHttps
info: User function triggered, starting execution
info: Execution took 19 ms, user function completed successfully
info: User function triggered, starting execution
info: Execution took 1 ms, user function completed successfully
functions bug

Comentario más útil

En caso de que otros terminen aquí, aquí se explica cómo configurarlo en functions/package.json para que tsc -w ejecute por separado de firebase serve :

{
  "name": "functions",
  "scripts": {
...
    "serve": "tsc -w | firebase serve --only functions",
...
  },

En otras palabras, ejecute tsc -w y canalice la salida a firebase serve . No creo que la tubería envíe realmente nada; Creo que cuando cambia la fuente, tsc se vuelve a ejecutar y firebase serve está mirando el directorio de salida de tsc ( lib ), por lo que se vuelve a cargar. Así que la tubería está realmente ahí para la gestión de procesos.

Todos 43 comentarios

Acabo de probar esto en una máquina diferente (Debian Stretch) con un proyecto nuevo (firebase init) y sucedió lo mismo con la función hello world. Me di cuenta de que si cambiaba la fuente antes de enviar una solicitud a la función, pero después de que la función estuviera lista para funcionar, podía hacer que se recargara en caliente una vez y luego dejaba de funcionar nuevamente.

Intenté crear un nuevo proyecto (firebase init) en una Mac y una máquina Linux, funciona en Mac y no en Linux.

Hice algunos experimentos y pude obtener el ejemplo de hola mundo en JavaScript para recargar en caliente, pero no el ejemplo de TypeScript. Parece que firebase serve solo mira index.js en el directorio configurado en `firebase.json.

Para que mi proyecto se recargue para TypeScript (y supongo que diseños de JavaScript más complejos que tienen más que solo index.js ) tuve que usar Webpack para generar un solo archivo functions/lib/index.js y configurar Firebase para buscar mi código de funciones en functions/list . Esto hace que la recarga en caliente funcione tanto para firebase functions:shell como para firebase serve .

Cuando estaba usando tsc (según la plantilla firebase init ), el código solo se recargaría si modificaba el archivo index.js resultante. Mi flujo de trabajo actual es ejecutar webpack --watch en una terminal con firebase serve --only functions en otra. Ahora tengo una recarga en caliente. Sería bueno si pudiera volver al valor predeterminado desde firebase init .

Firebase.json actualizado

{    
  "functions": {
    "predeploy": "npm --prefix functions run build",
    "source": "functions/list"
  }
}

@safarmer ¿Cómo es su functions / package.json? ¿Tiene un campo main ?

Empecé a usar el valor predeterminado generado por firebase init

{
  "name": "functions",
  "description": "Cloud Functions for Firebase",
  "scripts": {
    "lint": "tslint --project tsconfig.json",
    "build": "tsc --project tsconfig.json",
    "serve": "yarn run build && firebase serve --only functions",
    "shell": "yarn run build && firebase functions:shell",
    "start": "yarn run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  },
  "main": "lib/index.js",
  "dependencies": {
    ...
  },
  "devDependencies": {
    ...
  },
  "private": true
}

La forma más sencilla que tengo de replicar el problema:

  1. firebase init && cd functions && yarn
  2. Descomentar la función helloWorld
  3. mkdir src/handlers && mv src/index.ts src/handlers/helloworld.ts
  4. echo "export * from './handlers/helloworld';" > src/index.ts
  5. En la terminal 1: yarn build --watch
  6. En la terminal 2: firebase serve --only functions

Al visitar la URL en un navegador, verá el mensaje de hola mundo. Si cambia la cadena devuelta por el controlador en handler.ts, la única forma de cambiar el resultado es reiniciar el comando firebase serve .

Agregar "source": "functions/lib" a firebase.json hace que el código se vuelva a cargar en caliente si cambia algo en functions/lib pero los directorios de nivel inferior no activan una recarga. Es posible ejecutar touch lib/injex.js para activar una recarga. Por ejemplo, cambiar un controlador en src/index.ts dispara la recarga, pero cambiar src/handlers/helloworld.ts no.

@laurenzlong, lo mejor que tengo hasta ahora es (tomado del resultado predeterminado de firebase init) a continuación. Con esto, todavía necesito ejecutar touch lib/index.js . Otro problema con esto es que firebase deploy ya no funciona.

firebase.json

{
  "functions": {
    "predeploy": [
      "npm --prefix \"$RESOURCE_DIR\" run lint",
      "npm --prefix \"$RESOURCE_DIR\" run build"
    ],
    "source": "functions/lib"
  }
}

funciones / package.json

{
  "name": "functions",
  "scripts": {
    "lint": "tslint --project tsconfig.json",
    "build": "tsc",
    "serve": "npm run build && firebase serve --only functions",
    "shell": "npm run build && firebase functions:shell",
    "start": "npm run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  },
  "main": "lib/index.js",
  "dependencies": {
    "firebase-admin": "~5.12.0",
    "firebase-functions": "^1.0.1"
  },
  "devDependencies": {
    "tslint": "^5.8.0",
    "typescript": "^2.5.3"
  },
  "private": true
}

@laurenzlong Tengo un ejemplo simple que puede clonar para reproducir el problema en Linux:
https://github.com/safarmer/firebase-functions

¡Gracias por la reproducción! Lo echaré un vistazo la semana que viene.

El mismo problema aquí :)
Para mí, parece que firebase serve no es compatible con TypeScript por ahora ...

He comparado los archivos que solicitó con los que envió @safarmer y tengo las mismas configuraciones. No me sorprende ya que esta es la configuración oficial para usar con TypeScript

Creo que el problema es que firebase serve no está escuchando los cambios en el directorio "fuente" de funciones y no ejecutará los scripts previos a la implementación, definidos en firebase.json .

Sería genial si esto se agregara. :RE

Ahh y sería genial si pudiera definir otros scripts previos a la implementación para firebase serve, por lo que no tendré que ejecutar, por ejemplo, tslint en las pruebas :)

@IchordeDionysos No creo que sea solo TypeScript. Traté de hacer lo mismo que mi ejemplo en JavaScript y pareció hacer lo mismo. Creo que el problema es que el servidor solo mira el punto de entrada y no el resto del código. Es de esperar que el equipo de la base de fuego pueda arrojar algo de luz sobre el problema pronto.

@laurenzlong La instalación manual de watchman parece hacer que las cosas funcionen (gracias @tstirrat por la sugerencia)

Gracias por la reproducción detallada @safarmer , muy útil. Pude rastrear la raíz del problema y presenté https://github.com/GoogleCloudPlatform/cloud-functions-emulator/issues/207. Siga ese problema.

Para otros que vienen aquí, instale el watchman de la fuente o Linuxbrew , no el paquete npm

@laurenzlong Puedo reproducir este problema en Windows y, en particular, el cambio de index.ts no se detecta. Tengo que ejecutar tsc manualmente. A continuación, se detecta el cambio y se vuelve a cargar la función.
¿Debo abrir una edición separada?

notas rápidas: a veces se detecta info: Worker for helloWorld closed due to file changes. en ts pero lib no se actualiza. otras veces no se detecta en absoluto. ejecutar tsc manualmente siempre vuelve a cargar la función.

@tstirrat la instalación de según las instrucciones no parece funcionar

¿Qué errores se encuentra específicamente al instalar Watchman?

Sin errores al instalar vigilante. Pero servir funciones no calienta
recargar. Tengo que dejar de servir, construir y volver a servir después de cada cambio.

El miércoles 21 de noviembre de 2018 a la 1:01 a.m., Kevin Jian [email protected] escribió:

¿Qué errores se encuentra específicamente al instalar Watchman?

-
Estás recibiendo esto porque comentaste.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/firebase/firebase-tools/issues/758#issuecomment-440460196 ,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/AHgHbeA_iECsIMH3V9P7NQypsmudF_IQks5uxInggaJpZM4Tta12
.

Reapertura debido a varios informes de que esto aún no funciona en Windows

Todavía no funciona en Ubuntu 18.04 con Node.js v10.15.0

Mi problema estaba relacionado con el emulador:
https://github.com/GoogleCloudPlatform/cloud-functions-emulator/issues/196

Hola a todos, gracias por los informes detallados. @afuggini Obtengo 404 cuando hago clic en ese enlace, ¿están configurados correctamente los permisos en ese repositorio para la visualización pública? Hay otro problema similar a este: https://github.com/firebase/firebase-tools/issues/1022. Escuché que este problema está creando un problema para el desarrollo local con TypeScript.

Presenté un error en nuestro rastreador interno: 123266946. No puedo comprometerme con cuándo podemos solucionar esto, pero sepa que se está rastreando. ¡Los RP son bienvenidos!

También encontré este error. No pude crear ninguna solución, así que tengo que reiniciar el servidor después de cada cambio. Si conoce una solución alternativa confiable, hágamelo saber.

@ondratra, ¿ puede proporcionar su versión de CLI actual, plataforma de sistema operativo y hacernos saber si está trabajando con algo que no sea npm (por ejemplo, yarn )?

@bkendall Estoy en Debian (sid). Los archivos fuente mecanografiados se miran y compilan a través de tsc -w + las funciones se sirven a través de firebase --only functions serve . package.json contiene la ruta correcta a
js archivo de salida {"main": "dist/src/index.js", ...} . Incluso intenté usar el paquete tsc-watch y explícitamente el archivo de índice touch , pero sin éxito.

$ firebase --version
6.3.1

Chicos, revisen mi comentario anterior. El problema está relacionado con el cloud-functions-emulator . Utiliza la función fs watch, que tiene un problema conocido en Linux. Así que no espere una solución directamente de firebase-tools.

@ribizli thx, el enlace que ha compartido seguramente explica la naturaleza del problema. Pero todavía no encontré ninguna solución. ¿Existe la posibilidad de ver archivos a través de un script personalizado y forzar la recarga de firebase?

@ondratra fork @google-cloud/functions-emulator , agregue node-watch como mencioné en mi comentario vinculado, npm link el paquete. Reinstale firebase-tools : tiene @google-cloud/functions-emulator como dependencia opcional, por lo que se utilizará su versión vinculada.

Y finalmente: puede hacer un PR para https://github.com/GoogleCloudPlatform/cloud-functions-emulator y esperar que lo acepten y lo publiquen pronto. (Podría vivir con mi solución alternativa, así que no he contribuido)

funciones -> index.js después de guardar este archivo, ¿cómo puedo iniciar la ejecución automática de "firebase serve"

Solución alternativa de https://github.com/GoogleCloudPlatform/cloud-functions-emulator/issues/196 (gracias @dirkjot):

Esto funcionó para mí, aquí hay instrucciones completas y una solución para el pequeño error tipográfico de @ribizli :

  • Busque su directorio @google-cloud , probablemente en su node_modules (vea más abajo para Firebase)
  • cd functions-emulator
  • Agregar reloj de nodo: npm install --save node-watch
  • Edite el archivo src/supervisor/worker.js
  • Alrededor de la línea 180, encontrará fs.watch(localdir, { . Reemplace esto con require('node-watch')(localdir, { .

Usando Firebase con mecanografiado, todo lo que tengo que hacer es ejecutar tsc -w en una terminal separada (la variante de reloj de npm run build ). Ahora puedo cambiar mi código fuente y el emulador notará los cambios.

Si instaló firebase globalmente, puede encontrar estos archivos navegando hasta cd $(npm root -g)/firebase-tools/node_modules/@google-cloud .

Hey gente -

Este error estaba relacionado con la capacidad de recarga en caliente del emulador de Cloud Functions heredado. A partir de mayo de 2019 ya no usamos google-cloud/functions-emulator en firebase-tools por lo que esto cambia la naturaleza del error (creo que la nueva naturaleza es que no existe).

Aprecio que todos trabajen duro y descubran soluciones y, finalmente, nuestro nuevo emulador debería permitir que los idiomas transpilados se recarguen en caliente siempre que esté ejecutando su observador (como tsc -w ) por separado de firebase serve .

Con el nuevo backend del emulador, hemos resuelto este problema y ahora todas las soluciones en este hilo están desactualizadas, así que voy a cerrar este hilo para evitar confusiones.

Si sigue viendo algún comportamiento no deseado, abra un nuevo error.

¡Gracias de nuevo!

En caso de que otros terminen aquí, aquí se explica cómo configurarlo en functions/package.json para que tsc -w ejecute por separado de firebase serve :

{
  "name": "functions",
  "scripts": {
...
    "serve": "tsc -w | firebase serve --only functions",
...
  },

En otras palabras, ejecute tsc -w y canalice la salida a firebase serve . No creo que la tubería envíe realmente nada; Creo que cuando cambia la fuente, tsc se vuelve a ejecutar y firebase serve está mirando el directorio de salida de tsc ( lib ), por lo que se vuelve a cargar. Así que la tubería está realmente ahí para la gestión de procesos.

La instalación funcionó al mismo tiempo para mí:

"build:watch": "tsc -w && cp src/*.json lib",
"serve": "firebase serve --only functions",
"start": "concurrently \"npm run build:watch\" \"npm run serve\"",

Para mí, en [email protected] la recarga en caliente no funciona de inmediato. Modifiqué build en functions/package.json para que sea tsc -w como

{
  "name": "functions",
  "scripts": {
   ...
      "build": "tsc -w",
   ...
  },

Esto mantendrá el reloj activo para las funciones cuando ejecuto npm run build , luego desde another terminal ejecuté firebase emulators:start .

@ rami-alloush, ese es el flujo de trabajo que también uso. Los emuladores no reconstruyen su código, pero lo recargan en caliente.

otra version

{
    "build": "tsc -w &>/dev/null &",
    "shell": "npm run build && firebase functions:shell",
}

esto ejecuta tsc en segundo plano y silencioso, por lo que no necesita otra terminal.

¡Gracias por la reproducción! Lo echaré un vistazo la semana que viene.

¿Lo es?

Frente al mismo problema con el mecanografiado, la recarga en caliente no funciona.

lo mismo ... la recarga en caliente no funciona, y es difícil hacer que el emulador reconozca los cambios en absoluto ...

@oluckyman solucionó el problema. muy agradable

https://github.com/firebase/firebase-tools/issues/758#issuecomment -620096052

[ACTUALIZADO]

  • firebase-tools => 8.7.0

Mi solución:

package.json

...
 "scripts": {
    "lint": "tslint --project tsconfig.json",
    "build": "tsc -w --preserveWatchOutput",
    "serve": "tsc && firebase emulators:exec --ui --only functions,firestore 'yarn build'",
    "shell": "yarn run build && firebase functions:shell",
    "start": "yarn run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  },
...

Ejecutar yarn serve

Manifestación

Aug-06-2020 14-05-38

Esto funciona perfectamente bien para mí en este momento en la versión 8.8.1 firebase-tools usando mecanografiado. Gracias por los consejos chicos @moifort @garyo @safarmer @abeisgoat : 1st_place_medal::

"scripts": {
    ...
    ...
    "serve": "yarn build | firebase emulators:start --only functions",
    "build": "./node_modules/.bin/tslint --project tsconfig.json && ./node_modules/.bin/tsc --watch --preserveWatchOutput"
  },
¿Fue útil esta página
0 / 5 - 0 calificaciones