| Sprache auswählen : | Node.js Python |
Eine Cloud Functions-Funktion kann externe Module und lokale Abhängigkeiten verwenden. Wie Sie Abhängigkeiten angeben und verwalten, hängt von der Laufzeitsprache ab.
Node.js
Eine Funktion kann externe Node.js-Module sowie lokale Daten verwenden. Abhängigkeiten in Node.js werden mit npm verwaltet und in einer Metadatendatei namens package.json ausgedrückt. Cloud Functions-Node.js-Laufzeiten unterstützen die Installation mit npm, yarn oder pnpm.
Zum Angeben einer Abhängigkeit für die Funktion fügen Sie diese der Datei package.json hinzu.
In diesem Beispiel ist eine Abhängigkeit in der Datei package.json enthalten:
{ "dependencies": { "escape-html": "^1.0.3" } }
Die Abhängigkeit wird dann in die Funktion importiert:
JavaScript
const onRequest = require("firebase-functions/https");
const escapeHtml = require("escape-html");
// Return a greeting with the input HTML-escaped.
exports.hello = onRequest((req, res) => {
res.send(`Hello ${escapeHtml(req.query.name || req.body.name || "World")}!`);
});
TypeScript
import { onRequest } from "firebase-functions/https";
import * as escapeHtml from "escape-html";
// Return a greeting with the input HTML-escaped.
export let hello = onRequest((req, res) => {
res.send(`Hello ${escapeHtml(req.query.name || req.body.name || "World")}!`);
});
Lokale Node.js-Module einschließen
Sie können auch lokale Node.js-Module in Ihre Funktion einbinden. Deklarieren Sie dazu Ihr Modul in package.json mit dem Präfix file:. Im folgenden Beispiel steht mymodule für den Modulnamen und mymoduledir für das Verzeichnis, in dem das Modul enthalten ist:
{ "dependencies": { "mymodule": "file:mymoduledir" } }
Der Code für dieses lokale Modul sollte nicht im Ordner node_modules im Stammverzeichnis der Funktion gespeichert werden.
Zusätzliche Schritte für TypeScript
TypeScript ist besonders nützlich, wenn Sie Bibliotheken mit Typinformationen verwenden.
So kann TypeScript Syntaxfehler erkennen und Editoren können Ihnen bessere Vorschläge für die automatische Vervollständigung geben. Einige Bibliotheken wie firebase-admin und firebase-functions werden mit TypeScript-Definitionen ausgeliefert.
Viele Bibliotheken bieten keine eigene TypeScript-Definition. Das
Projekt DefinitelyTyped bietet
von der Community verwaltete Definitionen für die beliebtesten Node-Bibliotheken.
DefinitelyTyped veröffentlicht diese Definitionen unter demselben NPM-Paketnamen, aber in der Organisation "@types". Sie können beispielsweise die Typinformationen für die Bibliothek uuid mit dem folgenden Befehl installieren:
npm install @types/uuid
Wenn Sie mit TypeScript vertrauter sind, kombinieren Sie möglicherweise beide Installationen:
npm install uuid @types/uuid
Typabhängigkeiten sollten dieselbe Art wie die Bibliotheksabhängigkeit haben. Sie sollten uuid beispielsweise nicht als normale Abhängigkeit und @types/uuid als
Entwicklungs- oder Peer-Abhängigkeit speichern.
Node.js-Module laden
Verwenden Sie die Node.js-Funktion require(), um ein installiertes Node.js-Modul zu laden. Sie können die Funktion require() auch verwenden, um lokale Dateien zu importieren, die Sie gemeinsam mit der Funktion bereitstellen möchten.
Wenn Sie Funktionen in TypeScript schreiben, verwenden Sie die
import
Anweisung auf dieselbe Weise, um ein installiertes Node.js-Modul zu laden.
Private Module verwenden
Sie können ein privates npm-Modul verwenden. Geben Sie dazu Einstellungen für die Authentifizierung mit der Registry in einer .npmrc-Datei im Verzeichnis der Funktion an. Wenn Sie Yarn Version 2 oder höher als Paketmanager verwenden, heißt diese Datei .yarnrc.yml.
Private Module aus Artifact Registry
In einem Artifact Registry Node.js-Package Repository
können private Module für Ihre Funktion gehostet werden. Wenn Sie eine Google Cloud Functions
Funktion bereitstellen, generiert der Build-Prozess automatisch Artifact Registry-Anmeldedaten
für das Cloud Build-Dienstkonto.
Sie müssen nur das Artifact Registry-Repository in .npmrc auflisten, ohne zusätzliche Anmeldedaten zu generieren. Beispiel:
@SCOPE:registry=https://REGION_ID-npm.pkg.dev/PROJECT_ID/REPOSITORY_NAME
//REGION_ID-npm.pkg.dev/PROJECT_ID/REPOSITORY_NAME:always-auth=true
Dieser Ansatz kann auch für den Yarn v1-Paketmanager verwendet werden.
Wenn Sie Yarn v2 oder höher verwenden, müssen Sie nur das Artifact Registry-Repository in .yarnrc.yml ohne zusätzliche Anmeldedaten auflisten.
Beispiele:
npmScopes:
SCOPE:
npmRegistryServer: https://REGION_ID-npm.pkg.dev/PROJECT_ID/REPOSITORY_NAME
npmAlwaysAuth: true
Private Module aus anderen Repositories
Die npm-Dokumentation erläutert, wie benutzerdefinierte, schreibgeschützte Zugriffstoken erstellt werden. Wir raten davon ab, die im Basisverzeichnis erstellte .npmrc-Datei zu verwenden, da sie ein Lese-/Schreibtoken enthält. Schreibberechtigungen sind während der Bereitstellung nicht erforderlich und können ein Sicherheitsrisiko darstellen.
Fügen Sie die .npmrc-Datei nicht hinzu, wenn Sie keine privaten Repositories verwenden, da sie die Bereitstellungszeit für Ihre Funktionen erhöhen kann.
Dateiformat
Wenn Sie eine .npmrc-Datei zum Festlegen eines benutzerdefinierten Auth-Tokens verwenden, sollte es die unten aufgeführte Zeile enthalten.
//REGISTRY_DOMAIN/:_authToken=AUTH_TOKEN
Ersetzen Sie:
- REGISTRY_DOMAIN: der Domainname Ihrer privaten npm-Registry. Wenn Ihr Repository bei
npmjs.orggehostet wird, legen Sie dieses Feld aufregistry.npmjs.orgfest. AUTH_TOKEN: das Autorisierungstoken für Ihre npm-Registry. Dies kann entweder der Literaltextwert des Tokens oder der Textstring
${NPM_TOKEN}sein, dernpmdurch den tatsächlichen Tokenwert aus der Umgebung ersetzt.Sie können die Umgebungsvariable
$NPM_TOKENmit dem Argument--set-build-env-varsauf den Befehlgcloud functions deployfestlegen. Weitere Informationen zum NPM-Authentifizierungstoken finden Sie in der NPM-Anleitung zu privaten Modulen.
Python
Es gibt zwei Möglichkeiten, Abhängigkeiten für Cloud Functions festzulegen, die in
Python geschrieben wurden: entweder mithilfe der Datei pip des Paketmanagers'
requirements.txt oder durch Erstellen eines Pakets, das neben der Funktion auch lokale Abhängigkeiten enthält.
Die Abhängigkeitsspezifikation mit dem Standard Pipfile/Pipfile.lock wird nicht unterstützt. Das Projekt sollte diese Dateien nicht enthalten.
Abhängigkeiten mit pip angeben
Abhängigkeiten in Python werden mit pip verwaltet und in einer Metadatendatei mit dem Namenrequirements.txt ausgedrückt.
Diese Datei muss sich im selben Verzeichnis wie die Datei main.py befinden, die den Funktionscode enthält.
Wenn Sie Ihre Funktion bereitstellen oder noch einmal bereitstellen, verwendet Cloud Functions pip, um die neueste Version Ihrer Abhängigkeiten herunterzuladen und zu installieren, wie in der Datei requirements.txt angegeben.
Die Datei requirements.txt enthält eine Zeile pro Paket. Jede Zeile enthält den Paketnamen und optional die angeforderte Version. Weitere Informationen finden Sie in der Referenz zu requirements.txt.
Es empfiehlt sich, Ihre Abhängigkeitspakete an eine bestimmte Version anzuheften, um zu verhindern, dass Ihr Build von Änderungen an der Abhängigkeitsversion beeinträchtigt wird.
Hier sehen Sie eine requirements.txt-Beispieldatei:
functions-framework requests==2.20.0 numpy
Paket mit lokalen Abhängigkeiten erstellen
Sie können auch ein Paket mit der Funktion und ihren Abhängigkeiten erstellen und bereitstellen. Dies ist nützlich, wenn Ihre Abhängigkeit nicht über den pip-Paketmanager verfügbar ist oder der Internetzugriff Ihrer Cloud Functions-Umgebung eingeschränkt ist.
Beispielsweise können Sie eine Verzeichnisstruktur verwenden, die so aussieht:
myfunction/
├── main.py
└── localpackage/
├── __init__.py
└── script.py
Anschließend können Sie den Code mit der folgenden import-Anweisung wie gewohnt aus localpackage importieren.
# Code in main.py from localpackage import script
Beachten Sie, dass bei diesem Ansatz keine setup.py-Dateien ausgeführt werden. Pakete mit diesen
Dateien können weiterhin gebündelt werden, aber in Cloud Functions unter Umständen nicht ordnungsgemäß ausgeführt werden.