Umgang mit Abhängigkeiten


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 am hilfreichsten, wenn Sie Bibliotheken mit Typinformationen verwenden. So können Syntaxfehler in TypeScript erkannt und in Editoren bessere Vorschläge für die automatische Vervollständigung angezeigt werden. Einige Bibliotheken wie firebase-admin und firebase-functions werden mit TypeScript-Definitionen ausgeliefert.

Viele Bibliotheken haben keine eigene TypeScript-Definition. Das DefinitelyTyped-Projekt bietet von der Community verwaltete Definitionen für die beliebtesten Node-Bibliotheken. DefinitelyTyped veröffentlicht diese Definitionen unter demselben NPM-Paketnamen, aber innerhalb der Organisation „@types“. Sie können beispielsweise die Typinformationen für die uuid-Bibliothek mit dem folgenden Befehl installieren:

npm install @types/uuid

Wenn Sie sich mit TypeScript vertraut gemacht haben, werden Sie möglicherweise beide Installationsarten kombinieren:

npm install uuid @types/uuid

Typabhängigkeiten sollten vom selben Typ wie die Bibliotheksabhängigkeit sein. Sie sollten beispielsweise uuid 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 auch die Funktion require() verwenden, um lokale Dateien zu importieren, die Sie gemeinsam mit der Funktion bereitstellen möchten.

Wenn Sie Funktionen in TypeScript schreiben, verwenden Sie die Anweisung import 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.org gehostet wird, legen Sie dieses Feld auf registry.npmjs.org fest.
  • AUTH_TOKEN: das Autorisierungstoken für Ihre npm-Registry. Dies kann entweder der Literaltextwert des Tokens oder der Textstring ${NPM_TOKEN} sein, der npm durch den tatsächlichen Tokenwert aus der Umgebung ersetzt.

    Sie können die Umgebungsvariable $NPM_TOKEN mit dem Argument --set-build-env-vars auf den Befehl gcloud functions deploy festlegen. Weitere Informationen zum NPM-Authentifizierungstoken finden Sie in der NPM-Anleitung zu privaten Modulen.