Firebase-tools: firebase.json „functions.ignore“ bläht den Paket-Upload auf

Erstellt am 15. Aug. 2019  ·  3Kommentare  ·  Quelle: firebase/firebase-tools

NICHT LÖSCHEN validate_template=true template_path=.github/ISSUE_TEMPLATE/bug_report.md Vielen Dank für Ihren Beitrag zur Firebase-Community! md5-cd82511516d4d120ac6f38b938897bc8 Ja, wir sind definitiv nicht perfekt! Bitte verwenden Sie diese Vorlage und fügen Sie beim Öffnen der Ausgabe eine minimale Repro bei. Wenn Sie wissen, wie Sie das Problem lösen können, erstellen Sie bitte einen Pull-Request, und wir prüfen ihn gerne! md5-d1dc1414712186318d009e8257a27e48 Großartig, wir hören gerne, wie wir unsere Produkte verbessern können! Verwenden Sie diese Vorlage jedoch nicht, um eine Feature-Anfrage einzureichen. Bitte senden Sie Ihre Funktionsanfragen an: https://firebase.google.com/support/contact/bugs-features/md5-a11e3d9ea91af19a593bf84612124e1a Wir erhalten viele davon und wir helfen Ihnen gerne, aber GitHub ist nicht der beste Ort für sie und sie wird geschlossen. Bitte werfen Sie zuerst einen Blick auf die Anleitung: https://firebase.google.com/docs/cli/ Wenn die offizielle Dokumentation nicht weiterhilft, versuchen Sie es über unseren offiziellen Support-Kanal: https://firebase.google.com/ support/ Weitere Orte, an denen Sie nach Lösungen oder Unterstützung durch die Community suchen können: - Stack Overflow: https://stackoverflow.com/ - Firebase Slack Community: https://firebase.community/ *Bitte vermeiden Sie doppeltes Posten auf mehreren Kanälen!*

Umgebungsinformationen


Firebase-Tools:

firebase --version
7.2.2


Plattform:
Sowohl MacOS (10.14.6 (18G87)) als auch Windows 10-Entwicklungsumgebungen.

Testfall


MCVE: Firebase-Funktionsvorlage + Abschnitt „functions.ignore“ in firebase.json

Schritte zum Reproduzieren

Erstellen Sie ein Firebase-Projekt.

Führen Sie Firebase-Init-Funktionen mit Standardoptionen aus und fügen Sie sie Ihrem neuen Projekt hinzu:

firebase init functions

Entkommentieren Sie die Beispielfunktion helloWorld in index.js und stellen Sie sie bereit:

⋊> ~/D/f/functions firebase deploy                                                                                    11:02:38

=== Deploying to 'test-function-deploy-3a957'...

i  deploying functions
i  functions: ensuring necessary APIs are enabled...
✔  functions: all necessary APIs are enabled
i  functions: preparing functions directory for uploading...
i  functions: packaged functions (22.95 KB) for uploading
✔  functions: functions folder uploaded successfully
i  functions: updating Node.js 8 function helloWorld(us-central1)...
✔  functions[helloWorld(us-central1)]: Successful update operation. 

✔  Deploy complete!

Project Console: https://console.firebase.google.com/project/test-function-deploy-3a957/overview
⋊> ~/D/f/functions

Beachten Sie die Größe der bereitgestellten gepackten Funktionen (22,95 KB).

Bearbeiten Sie firebase.json , um den Abschnitt „functions.ignore“ einzufügen:

{
  "functions": {
    "ignore": []
  }
}

Erneut bereitstellen:

⋊> ~/D/f/functions firebase deploy                                                                                    11:03:24

=== Deploying to 'test-function-deploy-3a957'...

i  deploying functions
i  functions: ensuring necessary APIs are enabled...
✔  functions: all necessary APIs are enabled
i  functions: preparing functions directory for uploading...
i  functions: packaged functions (9.07 MB) for uploading
✔  functions: functions folder uploaded successfully
i  functions: updating Node.js 8 function helloWorld(us-central1)...
✔  functions[helloWorld(us-central1)]: Successful update operation. 

✔  Deploy complete!

Project Console: https://console.firebase.google.com/project/test-function-deploy-3a957/overview
⋊> ~/D/f/functions 

Beachten Sie, dass das bereitgestellte Paket von 22,95 KB auf 9,07 MB angewachsen ist.

Erwartetes Verhalten

Ich erwarte, dass, wenn Dinge ignoriert werden, das bereitgestellte Paket eher kleiner als größer wird.

Tatsächliches Verhalten

Das bereitgestellte Paket wird um mehrere Größenordnungen von 22,95 KB auf 9,07 MB größer.

Als Referenz: Die Größe des Ordners functions einschließlich des lokalen node_modules beträgt in diesem Fall 29 MB. Der Ordner node_modules selbst ist 28,9 MB auf der Festplatte und ~6 MB gzippt.

Dies betrifft auch TypeScript-Projekte, vermutlich weil das Problem nach dem tsc -Teil der Dinge ausgelöst wird.

Kommentar

Ich habe noch keine gute/definitive Dokumentation für die Konfigurationsdatei firebase.json und insbesondere für den Abschnitt functions gefunden. Es gibt hier eine Dokumentation des Abschnitts hosting . Mein Verständnis der Struktur/Verwendung von functions.ignore basiert derzeit auf https://github.com/firebase/firebase-tools/issues/291#issuecomment -322526710.

Es gibt ein verwandtes Problem Nr. 429, bei dem @laurenzlong angibt, dass der Abschnitt ignore funktionsfähig/korrigiert sein sollte.

Offene Frage

Wo wird das bereitgestellte Paket vor der Bereitstellung lokal erstellt? Ich lief mit --debug und konnte keine nützlichen Dateipfade herausfinden.

Danke!

Danke fürs Nachdenken! Und mein Telefon-Tethering-Datenplan dankt Ihnen für die Lösung dieses Problems, da meine aktuelle Projektbereitstellung ~ 55 MB beträgt, bevor ich herausgefunden habe, was los ist :)

Hilfreichster Kommentar

Das Verhalten, das Sie beschrieben haben, ist das Verhalten, das ich erwarten würde.

Die Dokumentation beschreibt nicht functions.ignore , wie Sie darauf hingewiesen haben; es wird jedoch von der CLI verwendet .

Inoffiziell (insofern es _undokumentiert_ ist) hat firebase.ignore einen Standardwert von ["node_modules"] . Auf diese Weise können wir die Menge an Material begrenzen, die wir während der Bereitstellung hochladen müssen (was, wie Sie sich vorstellen können, sehr schnell sehr groß werden könnte). Durch das Setzen von firebase.ignore in package.json teilt es der CLI mit, dass _nothing_ ignoriert werden soll. Jetzt wird der Ordner node_modules in das Archiv aufgenommen und an Functions gesendet.

Um Ihre Frage zu beantworten: Bei einer allgemeinen Beschreibung des Prozesses erstellt die CLI kein Paket lokal. Es macht ungefähr Folgendes:

  1. Führt ein beliebiges Predeploy-Skript für Funktionen aus (auch in firebase.json angegeben).
  2. Analysiert den Quellcode für bereitzustellende Funktionen.
  3. Komprimiert den Quellcode (wobei normalerweise node_modules ignoriert wird) und lädt ihn in Functions hoch.

Sobald der Quellcode hochgeladen ist, führt die Functions-Infrastruktur npm install für die package.json aus, und die Quelle ist bereit, Benutzern zu dienen (zumindest in dieser superhandgewellten Erklärung).

Ich hoffe, das beantwortet Ihre Fragen. Aber da es hier keinen CLI-bezogenen Fehler gibt, werde ich dieses Problem schließen.

Alle 3 Kommentare

Das Verhalten, das Sie beschrieben haben, ist das Verhalten, das ich erwarten würde.

Die Dokumentation beschreibt nicht functions.ignore , wie Sie darauf hingewiesen haben; es wird jedoch von der CLI verwendet .

Inoffiziell (insofern es _undokumentiert_ ist) hat firebase.ignore einen Standardwert von ["node_modules"] . Auf diese Weise können wir die Menge an Material begrenzen, die wir während der Bereitstellung hochladen müssen (was, wie Sie sich vorstellen können, sehr schnell sehr groß werden könnte). Durch das Setzen von firebase.ignore in package.json teilt es der CLI mit, dass _nothing_ ignoriert werden soll. Jetzt wird der Ordner node_modules in das Archiv aufgenommen und an Functions gesendet.

Um Ihre Frage zu beantworten: Bei einer allgemeinen Beschreibung des Prozesses erstellt die CLI kein Paket lokal. Es macht ungefähr Folgendes:

  1. Führt ein beliebiges Predeploy-Skript für Funktionen aus (auch in firebase.json angegeben).
  2. Analysiert den Quellcode für bereitzustellende Funktionen.
  3. Komprimiert den Quellcode (wobei normalerweise node_modules ignoriert wird) und lädt ihn in Functions hoch.

Sobald der Quellcode hochgeladen ist, führt die Functions-Infrastruktur npm install für die package.json aus, und die Quelle ist bereit, Benutzern zu dienen (zumindest in dieser superhandgewellten Erklärung).

Ich hoffe, das beantwortet Ihre Fragen. Aber da es hier keinen CLI-bezogenen Fehler gibt, werde ich dieses Problem schließen.

Danke für die Info @bkendall.

Basierend auf #291 dachte ich fälschlicherweise, dass die CLI _immer_ node_modules ausschließt und dass das Zeug in functions.ignore additiv ist. Das Hinzufügen eines expliziten Musters für node_modules macht das, was Sie beschreiben.

@bkendall Warum nicht dokumentieren?

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen