Firebase-tools: Firebase Serve - funktioniert nur nicht beim Nachladen

Erstellt am 1. Mai 2018  ·  43Kommentare  ·  Quelle: firebase/firebase-tools

Versions Information

Feuerbasis - Version
3.18.4

Plattforminformationen

Ubuntu 18.04 x64

Schritte zum Reproduzieren

  1. Firebase-Cloud-Funktionen werden mit TypeScript unter Verwendung von Garn projiziert
  2. Garn bauen - Uhr
  3. Zeigen Sie eine HTTPS-Funktion im Browser an
  4. Funktionsantwort aktualisieren
  5. Seite im Browser aktualisieren

Erwartetes Verhalten

Der Browser zeigt aktualisierte Inhalte an

Tatsächliches Verhalten

Die Seite wird erst nach dem Neustart des Befehls firebase serve aktualisiert. Ich habe bestätigt, dass die Ausgabe in lib aktualisiert wurde.

> 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

Hilfreichster Kommentar

Für den Fall, dass andere hier landen, erfahren Sie hier, wie Sie es in functions/package.json einrichten, damit tsc -w getrennt von firebase serve :

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

Mit anderen Worten, führen Sie tsc -w und leiten Sie die Ausgabe in firebase serve . Ich glaube nicht, dass die Pfeife tatsächlich etwas sendet; Ich denke, wenn sich die Quelle ändert, tsc erneut ausgeführt wird und firebase serve Ausgabeverzeichnis von tsc ( lib ) überwacht, wird es neu geladen. Die Pipe ist also wirklich nur für das Prozessmanagement da.

Alle 43 Kommentare

Ich habe dies gerade auf einem anderen Computer (Debian Stretch) mit einem neuen Projekt (firebase init) versucht und das gleiche passierte mit der Hallo-Welt-Funktion. Ich habe festgestellt, dass ich, wenn ich die Quelle vor dem Senden einer Anforderung an die Funktion geändert habe, diese jedoch nach dem Bereitstellen der Funktion einmal zum Hot-Reload bringen und dann wieder nicht mehr funktionieren würde.

Ich habe versucht, ein neues Projekt (firebase init) auf einem Mac und einem Linux-Computer zu erstellen. Es funktioniert auf einem Mac und nicht auf Linux.

Ich habe einige Experimente durchgeführt und konnte das Hallo-Welt-Beispiel in JavaScript zum Hot-Reload bringen, aber nicht das TypeScript-Beispiel. Es scheint, dass firebase serve nur die index.js in dem in `firebase.json konfigurierten Verzeichnis überwacht.

Um mein Projekt für TypeScript neu zu laden (und ich nehme komplexere JavaScript-Layouts an, die mehr als nur index.js ), musste ich Webpack verwenden, um eine einzelne Datei functions/lib/index.js auszugeben und Firebase so zu konfigurieren, dass nach meiner gesucht wird Funktionscode in functions/list . Dadurch funktioniert das Hot-Reload sowohl für firebase functions:shell als auch für firebase serve .

Wenn ich tsc (gemäß der Vorlage firebase init ), wurde der Code nur neu geladen, wenn ich die resultierende Datei index.js geändert habe. Mein aktueller Workflow besteht darin, webpack --watch in einem Terminal und firebase serve --only functions in einem anderen Terminal auszuführen. Ich bekomme jetzt heißes Nachladen. Es wäre gut, wenn ich von firebase init zum Standard zurückkehren könnte.

Firebase.json wurde aktualisiert

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

@safarmer Wie sehen Ihre Funktionen / package.json aus? Hat es ein main Feld?

Ich hatte begonnen, den von firebase init generierten Standard zu verwenden

{
  "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
}

Der einfachste Weg, das Problem zu replizieren:

  1. firebase init && cd functions && yarn
  2. Kommentieren Sie die helloWorld-Funktion aus
  3. mkdir src/handlers && mv src/index.ts src/handlers/helloworld.ts
  4. echo "export * from './handlers/helloworld';" > src/index.ts
  5. In Terminal 1: yarn build --watch
  6. In Terminal 2: firebase serve --only functions

Wenn Sie die URL in einem Browser besuchen, sehen Sie die Hallo-Welt-Nachricht. Wenn Sie die vom Handler in handler.ts zurückgegebene Zeichenfolge ändern, können Sie das Ergebnis nur ändern, indem Sie den Befehl firebase serve neu starten.

Wenn Sie "source": "functions/lib" zu firebase.json hinzufügen, wird der Code heiß neu geladen, wenn Sie etwas in functions/lib ändern, aber niedrigere Hebelverzeichnisse kein Neuladen auslösen. Es ist möglich, touch lib/injex.js auszuführen, um ein erneutes Laden auszulösen. Das Ändern eines Handlers in src/index.ts löst beispielsweise ein erneutes Laden aus, das Ändern von src/handlers/helloworld.ts jedoch nicht.

@laurenzlong das Beste, was ich bisher habe, ist (aus dem Standardergebnis von firebase init) unten. Damit muss ich noch touch lib/index.js ausführen. Ein weiteres Problem dabei ist, dass firebase deploy nicht mehr funktioniert.

firebase.json

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

Funktionen / 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 Ich habe ein einfaches Beispiel, das Sie klonen können, um das Problem unter Linux zu
https://github.com/safarmer/firebase-functions

Danke für den Repro! Ich werde nächste Woche einen Blick darauf werfen.

Das gleiche Problem hier :)
Mir scheint, dass firebase serve Typescript derzeit nicht unterstützt ...

Ich habe die Dateien, nach denen Sie gefragt haben, mit denen von @safarmer verglichen und habe die gleichen Konfigurationen. Überrascht mich nicht, da dies die offizielle Konfiguration für TypeScript ist

Ich denke, das Problem ist, dass firebase serve nicht auf Änderungen im "Quell" -Verzeichnis der Funktionen wartet und die im firebase.json definierten Vorbereitstellungsskripte nicht ausführt.

Wäre toll, wenn dies hinzugefügt würde. : D.

Ahh und wäre großartig, wenn ich andere Predeploy-Skripte für Firebase Serve definieren könnte, damit ich zum Beispiel nicht tslint beim Testen ausführen muss :)

@IchordeDionysos Ich denke nicht, dass es nur TypeScript ist. Ich habe versucht, dasselbe wie in meinem Beispiel in JavaScript zu tun, und es schien dasselbe zu tun. Ich denke, das Problem ist, dass der Server nur den Einstiegspunkt und nicht den Rest des Codes betrachtet. Hoffentlich kann das Firebase-Team bald etwas Licht in das Problem bringen.

@laurenzlong manuelle Installation von Watchman scheint die Dinge zum Laufen zu bringen (danke

Vielen Dank für die ausführliche Repro @safarmer , sehr hilfreich. Ich konnte die Wurzel des Problems ausfindig machen und . Bitte folgen Sie diesem Problem.

Für andere, die hierher kommen, installieren Sie das watchman von der Quelle oder Linuxbrew , nicht das npm-Paket

@laurenzlong Ich kann dieses Problem unter Windows reproduzieren und insbesondere wird die Änderung von index.ts nicht erkannt. Ich muss tsc manuell ausführen. Die Änderung wird dann erkannt und die Funktion neu geladen.
Sollte ich eine separate Ausgabe eröffnen?

Kurznotizen: Manchmal wird info: Worker for helloWorld closed due to file changes. auf dem ts erkannt, aber die Bibliothek wird nicht aktualisiert. In anderen Fällen wird es überhaupt nicht erkannt. Durch manuelles Ausführen von tsc wird die Funktion immer neu geladen.

@tstirrat Installation von Watchman unter Windows gemäß den Anweisungen scheint nicht zu funktionieren

Welche Fehler treten bei der Installation von Watchman speziell auf?

Keine Fehler bei der Installation von Watchman. Aber Serving-Funktionen sind nicht heiß
neu laden. Ich muss nach jeder Veränderung aufhören zu dienen, zu bauen und wieder zu dienen.

Am Mittwoch, den 21. November 2018 um 01:01 Uhr schrieb Kevin Jian [email protected] :

Welche Fehler treten bei der Installation von Watchman speziell auf?

- -
Sie erhalten dies, weil Sie kommentiert haben.
Antworte direkt auf diese E-Mail und sieh sie dir auf GitHub an
https://github.com/firebase/firebase-tools/issues/758#issuecomment-440460196 ,
oder schalten Sie den Thread stumm
https://github.com/notifications/unsubscribe-auth/AHgHbeA_iECsIMH3V9P7NQypsmudF_IQks5uxInggaJpZM4Tta12
.

Wiedereröffnung aufgrund mehrerer Berichte, die unter Windows immer noch nicht funktionieren

Funktioniert immer noch nicht unter Ubuntu 18.04 mit Node.js v10.15.0

Hallo allerseits, danke für die detaillierten Berichte. @afuggini Ich erhalte 404, wenn ich auf diesen Link https://github.com/firebase/firebase-tools/issues/1022. Ich habe gehört, dass dieses Problem mit Typescript einen Schmerzpunkt für die lokale Entwicklung darstellt.

Ich habe einen Fehler in unserem internen Tracker gemeldet: 123266946. Ich kann mich nicht festlegen, wann wir uns darum kümmern können, weiß aber, dass dies verfolgt wird. PRs sind herzlich willkommen!

Ich bin auch auf diesen Fehler gestoßen. Ich konnte keine Problemumgehung erstellen, daher muss ich den Server nach jeder Änderung neu starten. Wenn Sie eine zuverlässige Problemumgehung kennen, lassen Sie es mich bitte wissen.

@ondratra Können Sie Ihre aktuelle CLI-Version und Betriebssystemplattform bereitstellen und uns npm (z. B. yarn ) arbeiten?

@bkendall Ich bin auf Debian (Sid). Typoskript-Quelldateien werden über tsc -w überwacht und kompiliert. Funktionen werden über firebase --only functions serve . package.json enthält den korrekten Pfad zu
js Ausgabedatei {"main": "dist/src/index.js", ...} . Ich habe sogar versucht, das Paket tsc-watch und explizit die Indexdatei touch verwenden, aber ohne Erfolg.

$ firebase --version
6.3.1

Leute, schaut euch meinen vorherigen Kommentar an. Das Problem hängt mit dem cloud-functions-emulator . Es wird die Überwachungsfunktion fs , bei der unter Linux ein bekanntes Problem auftritt. Erwarten Sie also keine Lösung direkt von firebase-tools.

@ribizli thx, der Link , den Sie geteilt haben, erklärt sicherlich die Art des Problems. Aber ich habe immer noch keine Problemumgehung gefunden. Gibt es eine Möglichkeit, Dateien über ein benutzerdefiniertes Skript zu überwachen und Firebase zum erneuten Laden zu zwingen?

@ondratra gabel @google-cloud/functions-emulator , füge node-watch wie ich in meinem verlinkten Kommentar erwähnt habe, npm link das Paket. Installieren Sie firebase-tools : Es hat @google-cloud/functions-emulator als optionale Abhängigkeit, sodass Ihre verknüpfte Version verwendet wird.

Und schließlich: Sie können eine PR unter https://github.com/GoogleCloudPlatform/cloud-functions-emulator erstellen und hoffen, dass sie diese bald akzeptieren und veröffentlichen. (Ich könnte mit meiner Problemumgehung leben, also habe ich nicht dazu beigetragen)

Funktionen -> index.js nach dem Speichern dieser Datei, wie ich "Firebase Serve" Autorun starten kann

Problemumgehung von https://github.com/GoogleCloudPlatform/cloud-functions-emulator/issues/196 (danke @dirkjot):

Dies hat bei mir funktioniert. Hier finden Sie eine vollständige Anleitung und eine Korrektur für @ribizlis kleinen Tippfehler:

  • Suchen Sie Ihr @google-cloud -Verzeichnis, wahrscheinlich in Ihrem node_modules (siehe unten für Firebase).
  • cd functions-emulator
  • Node-Watch hinzufügen: npm install --save node-watch
  • Bearbeiten Sie die Datei src/supervisor/worker.js
  • Um die Zeile 180 herum finden Sie fs.watch(localdir, { . Ersetzen Sie dies durch require('node-watch')(localdir, { .

Wenn ich Firebase mit Typoskript verwende, muss ich nur tsc -w in einem separaten Terminal ausführen (die Watch-Variante von npm run build ). Ich kann jetzt meinen Quellcode ändern und der Emulator wird die Änderungen bemerken.

Wenn Sie firebase global installiert haben, können Sie diese Dateien finden, indem Sie zu cd $(npm root -g)/firebase-tools/node_modules/@google-cloud navigieren.

Hallo Leute -

Dieser Fehler bezog sich auf die Hot-Reloading-Funktion des älteren Cloud-Funktionsemulators. Ab dem 19. Mai verwenden wir google-cloud/functions-emulator in firebase-tools sodass sich die Art des Fehlers ändert (ich glaube, die neue Natur ist, dass er nicht existiert).

Ich schätze jeden, der hart arbeitet und Problemumgehungen herausfindet, und schließlich sollte unser neuer Emulator das Hot-Reload aller transpilierten Sprachen ermöglichen, solange Sie Ihren Watcher (wie tsc -w ) getrennt von firebase serve .

Mit dem neuen Emulator-Backend haben wir dieses Problem behoben und jetzt sind alle Problemumgehungen in diesem Thread veraltet. Daher werde ich diesen Thread schließen, um Verwirrung zu vermeiden.

Wenn Sie immer noch ein unbeabsichtigtes Verhalten feststellen, öffnen Sie bitte einen neuen Fehler.

Danke noch einmal!

Für den Fall, dass andere hier landen, erfahren Sie hier, wie Sie es in functions/package.json einrichten, damit tsc -w getrennt von firebase serve :

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

Mit anderen Worten, führen Sie tsc -w und leiten Sie die Ausgabe in firebase serve . Ich glaube nicht, dass die Pfeife tatsächlich etwas sendet; Ich denke, wenn sich die Quelle ändert, tsc erneut ausgeführt wird und firebase serve Ausgabeverzeichnis von tsc ( lib ) überwacht, wird es neu geladen. Die Pipe ist also wirklich nur für das Prozessmanagement da.

Die gleichzeitige Installation hat bei mir funktioniert:

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

Für mich auf [email protected] Hot Reloading funktioniert nicht sofort. Ich habe das build in functions/package.json so geändert, dass es tsc -w as ist

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

Dadurch bleibt die Uhr für die Funktionen aktiv, wenn ich npm run build ausführe, und ab another terminal ich firebase emulators:start .

@ rami-alloush das ist der Workflow, den ich auch benutze. Die Emulatoren erstellen Ihren Code nicht neu, laden den erstellten Code jedoch im laufenden Betrieb neu.

Andere Version

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

Dies führt tsc im Hintergrund und leise aus, sodass Sie kein weiteres Terminal benötigen.

Danke für den Repro! Ich werde nächste Woche einen Blick darauf werfen.

Ist es?

Angesichts des gleichen Problems mit Typoskript funktioniert das Hot-Reloading nicht.

das gleiche ... heißes Nachladen funktioniert nicht und es ist schwierig, den Emulator dazu zu bringen, Änderungen überhaupt zu erkennen ...

@oluckyman Problem gelöst. Sehr schön

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

[AKTUALISIERT]

  • firebase-tools => 8.7.0

Meine Lösung:

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

Führen Sie yarn serve

Demo

Aug-06-2020 14-05-38

Dies funktioniert im Moment für mich auf Firebase-Tools-Version 8.8.1 mit Typoskript einwandfrei. Vielen Dank für die Tipps Jungs @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"
  },
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen