Firebase-tools: Firebase serve - fonctionne uniquement sans rechargement à chaud

Créé le 1 mai 2018  ·  43Commentaires  ·  Source: firebase/firebase-tools

Informations sur la version

firebase --version
3.18.4

Informations sur la plateforme

Ubuntu 18.04 x64

Étapes à suivre pour reproduire

  1. Projet de fonctions cloud Firebase avec TypeScript utilisant Yarn
  2. construction de fil - montre
  3. Afficher une fonction HTTPS dans le navigateur
  4. Mettre à jour la réponse de la fonction
  5. Actualiser la page dans le navigateur

Comportement prévisible

Le navigateur affiche le contenu mis à jour

Comportement réel

La page ne se met à jour qu'après le redémarrage de la commande firebase serve. J'ai confirmé que la sortie dans lib a été mise à jour.

> 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

Commentaire le plus utile

Au cas où d'autres se retrouveraient ici, voici comment le configurer dans functions/package.json afin que tsc -w s'exécute séparément de firebase serve :

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

En d'autres termes, exécutez tsc -w et redirigez la sortie vers firebase serve . Je ne pense pas que le tuyau envoie quoi que ce soit; Je pense que lorsque la source change, tsc s'exécute à nouveau et firebase serve regarde le répertoire de sortie de tsc ( lib ) pour qu'il se recharge. Donc, le tuyau est vraiment là pour la gestion des processus.

Tous les 43 commentaires

Je viens d'essayer ceci sur une machine différente (Debian Stretch) avec un nouveau projet (firebase init) et la même chose s'est produite avec la fonction hello world. J'ai remarqué que si je changeais la source avant d'envoyer une requête à la fonction, mais une fois que la fonction était prête à servir, je pourrais la recharger à chaud une fois, puis cesser de fonctionner à nouveau.

J'ai essayé de créer un nouveau projet (firebase init) sur un Mac et une machine Linux, cela fonctionne sur Mac et pas sur Linux.

J'ai fait quelques expériences et j'ai pu obtenir l'exemple hello world en JavaScript pour recharger à chaud mais pas l'exemple TypeScript. Il semble que firebase serve ne regarde que les index.js dans le répertoire configuré dans `firebase.json.

Pour recharger mon projet pour TypeScript (et je suppose des mises en page JavaScript plus complexes qui ont plus que index.js ), j'ai dû utiliser Webpack pour générer un seul fichier functions/lib/index.js et configurer Firebase pour rechercher mon code de fonctions dans functions/list . Cela permet alors au rechargement à chaud de fonctionner à la fois pour firebase functions:shell et firebase serve .

Lorsque j'utilisais tsc (selon le modèle firebase init ), le code ne se rechargeait que si je modifiais le fichier index.js résultant. Mon flux de travail actuel consiste à exécuter webpack --watch dans un terminal avec firebase serve --only functions dans un autre. Je reçois maintenant une recharge à chaud. Ce serait bien si je pouvais revenir à la valeur par défaut de firebase init .

Firebase.json mis à jour

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

@safarmer À quoi ressemble vos fonctions / package.json? Y a-t-il un champ main ?

J'avais commencé à utiliser la valeur par défaut générée par 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
}

Le moyen le plus simple de reproduire le problème:

  1. firebase init && cd functions && yarn
  2. Décommentez la fonction helloWorld
  3. mkdir src/handlers && mv src/index.ts src/handlers/helloworld.ts
  4. echo "export * from './handlers/helloworld';" > src/index.ts
  5. Dans le terminal 1: yarn build --watch
  6. Dans le terminal 2: firebase serve --only functions

En visitant l'URL dans un navigateur, vous voyez le message Hello world. Si vous modifiez la chaîne renvoyée par le gestionnaire dans handler.ts, la seule façon d'obtenir le résultat à modifier est de redémarrer la commande firebase serve .

L'ajout de "source": "functions/lib" à firebase.json de recharger le code à chaud si vous modifiez quelque chose dans functions/lib mais que les répertoires de levier inférieurs ne déclenchent pas de rechargement. Il est possible d'exécuter touch lib/injex.js pour déclencher un rechargement. Par exemple, changer un gestionnaire dans src/index.ts déclenche le rechargement, mais pas changer src/handlers/helloworld.ts .

@laurenzlong le meilleur que j'ai jusqu'à présent est (tiré du résultat par défaut de firebase init) est ci-dessous. Avec cela, j'ai encore besoin d'exécuter touch lib/index.js . Un autre problème avec ceci est que firebase deploy ne fonctionne plus.

firebase.json

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

fonctions / 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 J'ai un exemple simple que vous pouvez cloner pour reproduire le problème sous Linux:
https://github.com/safarmer/firebase-functions

Merci pour le repro! Je vais jeter un œil la semaine prochaine.

Le même problème ici :)
Pour moi, il semble que firebase serve ne prend pas en charge Typescript pour le moment ...

J'ai comparé les fichiers que vous avez demandés avec ceux envoyés par @safarmer et j'ai les mêmes configurations. Cela ne me surprend pas car c'est la configuration officielle à utiliser avec TypeScript

Je pense que le problème est que firebase serve n'écoute pas les changements dans le répertoire des fonctions "source" et n'exécute pas les scripts de prédéploiement, définis dans le firebase.json .

Ce serait formidable si cela était ajouté. :RÉ

Ahh et ce serait génial si je pouvais définir d'autres scripts de prédéploiement pour le serveur Firebase, donc je n'aurai pas à exécuter par exemple tslint en test :)

@IchordeDionysos Je ne pense pas que ce soit juste du TypeScript. J'ai essayé de faire la même chose que mon exemple en JavaScript et cela semblait faire la même chose. Je pense que le problème vient du fait que le serveur ne regarde que le point d'entrée et non le reste du code. Espérons que l'équipe Firebase pourra bientôt faire la lumière sur le problème.

@laurenzlong installer manuellement watchman semble faire fonctionner les choses (merci @tstirrat pour la suggestion)

Merci pour la repro détaillée @safarmer , très utile. J'ai pu localiser la racine du problème et déposé https://github.com/GoogleCloudPlatform/cloud-functions-emulator/issues/207. Veuillez suivre ce problème.

Pour les autres qui viennent ici, installez le watchman depuis la source ou Linuxbrew , pas le paquet npm

@laurenzlong Je peux reproduire ce problème dans Windows et en particulier le changement d'index.ts n'est pas détecté. Je dois exécuter manuellement tsc. Le changement est alors détecté et la fonction est rechargée.
Dois-je ouvrir un autre problème?

notes rapides: parfois info: Worker for helloWorld closed due to file changes. est détecté sur le ts mais la lib n'est pas rafraîchie. d'autres fois, ce n'est pas du tout détecté. l'exécution manuelle de tsc recharge toujours la fonction.

@tstirrat installer selon les instructions ne semble pas fonctionner

Quelles erreurs rencontrez-vous spécifiquement lors de l'installation de watchman?

Aucune erreur lors de l'installation de watchman. Mais servir les fonctions n'est pas chaud
recharger. Je dois arrêter de servir, construire et servir à nouveau après chaque changement.

Le mercredi 21 novembre 2018 à 01h01, Kevin Jian [email protected] a écrit:

Quelles erreurs rencontrez-vous spécifiquement lors de l'installation de watchman?

-
Vous recevez ceci parce que vous avez commenté.
Répondez directement à cet e-mail, affichez-le sur GitHub
https://github.com/firebase/firebase-tools/issues/758#issuecomment-440460196 ,
ou couper le fil
https://github.com/notifications/unsubscribe-auth/AHgHbeA_iECsIMH3V9P7NQypsmudF_IQks5uxInggaJpZM4Tta12
.

Réouverture en raison de plusieurs rapports indiquant que cela ne fonctionne toujours pas sous Windows

Ne fonctionne toujours pas sur Ubuntu 18.04 avec Node.js v10.15.0

Salut à tous, merci pour les rapports détaillés. @afuggini J'obtiens 404 lorsque je clique sur ce lien, les autorisations sont-elles correctement définies sur ce dépôt pour une consultation publique? Il existe un autre problème similaire à celui-ci: https://github.com/firebase/firebase-tools/issues/1022. J'ai entendu dire que ce problème crée un problème pour le développement local avec Typescript.

J'ai déposé un bogue dans notre traqueur interne: 123266946. Je ne peux pas m'engager à savoir quand nous pourrons nous en sortir, mais sachez que cela est suivi. Les RP sont les bienvenus!

J'ai également rencontré cette erreur. Je n'ai pas pu créer de solution de contournement, je dois donc redémarrer le serveur après chaque modification. Si vous connaissez une solution de contournement fiable, veuillez me le faire savoir.

@ondratra pouvez-vous fournir votre version actuelle de la CLI, la plate-forme du système d'exploitation, et nous faire savoir si vous travaillez avec autre chose que npm (par exemple yarn )?

@bkendall Je suis sur Debian (sid). Les fichiers sources de Typescript sont surveillés et compilés via tsc -w + les fonctions sont servies via firebase --only functions serve . package.json contient le chemin correct vers
js fichier de sortie {"main": "dist/src/index.js", ...} . J'ai même essayé d'utiliser le package tsc-watch et explicitement le fichier d'index touch , mais sans succès.

$ firebase --version
6.3.1

Les gars, vérifiez mon commentaire précédent. Le problème est lié au cloud-functions-emulator . Il utilise la fonction de surveillance fs , qui présente un problème connu sous Linux. Alors ne vous attendez pas à une solution directement de firebase-tools.

@ribizli thx, le lien que vous avez partagé explique sûrement la nature du problème. Mais je n'ai toujours pas trouvé de solution de contournement. Est-il possible de regarder des fichiers via un script personnalisé et de forcer Firebase à se recharger?

@ondratra fork @google-cloud/functions-emulator , ajoutez node-watch comme je l'ai mentionné dans mon commentaire lié, npm link le package. Réinstaller firebase-tools : il a @google-cloud/functions-emulator comme dépendance facultative, donc votre version liée sera utilisée.

Et enfin: vous pouvez faire un PR sur https://github.com/GoogleCloudPlatform/cloud-functions-emulator et espérer qu'ils accepteront et publieront bientôt. (Je pourrais vivre avec ma solution de contournement, donc je n'ai pas contribué)

fonctions -> index.js après avoir sauvegardé ce fichier, comment je peux démarrer "firebase serve" autorun

Solution de contournement de https://github.com/GoogleCloudPlatform/cloud-functions-emulator/issues/196 (merci @dirkjot):

Cela a fonctionné pour moi, voici des instructions complètes et un correctif pour la petite faute de frappe de @ribizli :

  • Trouvez votre répertoire @google-cloud , probablement dans votre node_modules (voir ci-dessous pour Firebase)
  • cd functions-emulator
  • Ajouter une surveillance de nœud: npm install --save node-watch
  • Modifier le fichier src/supervisor/worker.js
  • Vers la ligne 180, vous trouverez fs.watch(localdir, { . Remplacez ceci par require('node-watch')(localdir, { .

En utilisant Firebase avec typescript, tout ce que j'ai à faire est d'exécuter tsc -w dans un terminal séparé (la variante watch de npm run build ). Je peux maintenant changer mon code source et l'émulateur remarquera les changements.

Si vous avez installé firebase globalement, vous pouvez trouver ces fichiers en accédant à cd $(npm root -g)/firebase-tools/node_modules/@google-cloud .

Salut les gens -

Ce bogue était lié à la capacité de rechargement à chaud de l'ancien émulateur Cloud Functions. Depuis mai 19, nous n'utilisons plus google-cloud/functions-emulator dans firebase-tools donc cela change la nature du bogue (je crois que la nouvelle nature est qu'il n'existe pas).

J'apprécie que tout le monde travaille dur et trouve des solutions de contournement et enfin notre nouvel émulateur devrait permettre à tous les langages transpilés de se recharger à chaud tant que vous exécutez votre observateur (comme tsc -w ) séparément de firebase serve .

Avec le nouveau backend de l'émulateur, nous avons résolu ce problème et maintenant toutes les solutions de contournement de ce fil sont obsolètes, je vais donc fermer ce fil pour éviter toute confusion.

Si vous constatez toujours un comportement involontaire, veuillez ouvrir un nouveau bogue.

Merci encore!

Au cas où d'autres se retrouveraient ici, voici comment le configurer dans functions/package.json afin que tsc -w s'exécute séparément de firebase serve :

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

En d'autres termes, exécutez tsc -w et redirigez la sortie vers firebase serve . Je ne pense pas que le tuyau envoie quoi que ce soit; Je pense que lorsque la source change, tsc s'exécute à nouveau et firebase serve regarde le répertoire de sortie de tsc ( lib ) pour qu'il se recharge. Donc, le tuyau est vraiment là pour la gestion des processus.

L'installation simultanée a fonctionné pour moi:

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

Pour moi, le rechargement à chaud de [email protected] ne fonctionne pas immédiatement. J'ai modifié le build dans functions/package.json pour qu'il soit tsc -w comme

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

Cela gardera la montre active pour les fonctions lorsque j'exécute npm run build , puis à partir de another terminal j'ai exécuté firebase emulators:start .

@ rami-alloush c'est aussi le flux de travail que j'utilise. Les émulateurs ne reconstruisent pas votre code mais rechargent à chaud le code construit.

une autre version

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

cela exécute tsc en arrière-plan et silencieux, vous n'avez donc pas besoin d'un autre terminal.

Merci pour le repro! Je vais jeter un œil la semaine prochaine.

C'est ça?

Face au même problème avec dactylographié, le rechargement à chaud ne fonctionne pas.

idem ... le rechargement à chaud ne fonctionne pas, et il est difficile de faire en sorte que l'émulateur reconnaisse les changements ...

@oluckyman a résolu le problème. très agréable

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

[MIS À JOUR]

  • firebase-tools => 8.7.0

Ma solution:

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"
  },
...

Exécutez yarn serve

Démo

Aug-06-2020 14-05-38

Cela fonctionne parfaitement pour moi pour le moment sur la version de firebase-tools 8.8.1 utilisant du typecript. Merci pour les conseils les gars @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"
  },
Cette page vous a été utile?
0 / 5 - 0 notes