Gérer les dépendances


Une fonction est autorisée à utiliser d'autres modules Node.js ainsi que des données locales. Dans Node.js, les dépendances sont gérées avec npm et exprimées dans un fichier de métadonnées appelé package.json. Les environnements d'exécution Node.js de Cloud Functions sont compatibles avec l'installation via npm, yarn ou pnpm.

Pour spécifier une dépendance pour votre fonction, ajoutez-la au fichier package.json.

Dans cet exemple, une dépendance est répertoriée dans le fichier package.json :

{
  "dependencies": {
    "escape-html": "^1.0.3"
  }
}

La dépendance est alors importée dans la fonction :

const escapeHtml = require('escape-html');

// Return a greeting with the input HTML-escaped.
exports.hello = functions.https.onRequest((req, res) => {
  res.send(`Hello ${escapeHtml(req.query.name || req.body.name || 'World')}!`);
});
import * as escapeHtml from 'escape-html';

// Return a greeting with the input HTML-escaped.
export let hello = functions.https.onRequest((req, res) => {
  res.send(`Hello ${escapeHtml(req.query.name || req.body.name || 'World')}!`);
}

Inclure des modules Node.js locaux

Vous pouvez également inclure des modules Node.js locaux comme faisant partie de votre fonction. Pour ce faire, déclarez votre module dans le fichier package.json à l'aide du préfixe file:. Dans l'exemple suivant, mymodule fait référence au nom de votre module et mymoduledir correspond au répertoire contenant le module :

{
  "dependencies": {
    "mymodule": "file:mymoduledir"
  }
}

Le code de ce module local doit être stocké ailleurs que dans le dossier node_modules du répertoire racine de votre fonction.

Étapes supplémentaires pour TypeScript

TypeScript est particulièrement utile lorsque vous utilisez des bibliothèques contenant des informations de type. TypeScript peut ainsi détecter les erreurs de syntaxe et les éditeurs peuvent vous proposer de meilleures suggestions de saisie semi-automatique. Certaines bibliothèques, comme firebase-admin et firebase-functions, sont fournies avec des définitions TypeScript incluses.

De nombreuses bibliothèques ne fournissent pas leur propre définition TypeScript. Le projet DefinitelyTyped fournit des définitions gérées par la communauté pour les bibliothèques de nœuds les plus populaires. DefinitelyTyped publie ces définitions sous le même nom de package NPM, mais au sein de l'organisation "@types". Par exemple, vous pouvez installer les informations de type pour la bibliothèque uuid avec les éléments suivants:

npm install @types/uuid

À mesure que vous vous familiarisez avec TypeScript, vous pouvez combiner les deux installations:

npm install uuid @types/uuid

Les dépendances de type doivent être du même type que la dépendance de bibliothèque. Par exemple, vous ne devez pas enregistrer uuid en tant que dépendance normale et @types/uuid en tant que dépendance de développement ou dépendance de pair.

Charger des modules Node.js

Utilisez la fonction require() Node.js pour charger les modules Node.js que vous avez installés. Vous pouvez également utiliser la fonction require() pour importer les fichiers locaux que vous déployez avec votre fonction.

Si vous écrivez des fonctions en TypeScript, utilisez l'instruction import de la même manière pour charger les modules Node.js que vous avez installés.

Utiliser des modules privés

Vous pouvez utiliser un module npm privé en fournissant des paramètres d'authentification avec le registre dans un fichier .npmrc du répertoire de la fonction. Si vous utilisez comme gestionnaire de packages Yarn v2 ou une version ultérieure, ce fichier est nommé .yarnrc.yml.

Modules privés d'Artifact Registry

Un dépôt de packages Node.js Artifact Registry peut héberger des modules privés pour votre fonction. Lorsque vous déployez une fonction Google Cloud Functions, le processus de compilation génère automatiquement des identifiants Artifact Registry pour le compte de service Cloud Build. Il vous suffit de répertorier le dépôt Artifact Registry dans votre fichier .npmrc sans générer d'identifiants supplémentaires. Exemple :

@SCOPE:registry=https://REGION_ID-npm.pkg.dev/PROJECT_ID/REPOSITORY_NAME
//REGION_ID-npm.pkg.dev/PROJECT_ID/REPOSITORY_NAME:always-auth=true

Cette approche fonctionne également pour le gestionnaire de packages Yarn v1. Si vous utilisez Yarn v2 ou une version ultérieure, il vous suffit de répertorier le dépôt Artifact Registry dans votre fichier .yarnrc.yml sans identifiants supplémentaires. Exemple :

npmScopes:
  SCOPE:
    npmRegistryServer: https://REGION_ID-npm.pkg.dev/PROJECT_ID/REPOSITORY_NAME
    npmAlwaysAuth: true

Modules privés d'autres dépôts

La documentation npm explique comment créer des jetons d'accès personnalisés en lecture seule. Nous déconseillons l'utilisation du fichier .npmrc créé dans le répertoire d'accueil, car il contient un jeton de lecture/écriture. Les autorisations d'écriture ne sont pas requises pendant le déploiement et peuvent présenter un risque pour la sécurité.

N'incluez pas le fichier .npmrc si vous n'utilisez pas de dépôts privés, car cela peut augmenter le temps de déploiement de vos fonctions.

Format de fichier

Si vous utilisez un fichier .npmrc pour définir un jeton d'authentification personnalisé, il doit inclure la ligne ci-dessous.

//REGISTRY_DOMAIN/:_authToken=AUTH_TOKEN

Remplacez :

  • REGISTRY_DOMAIN : le nom de domaine de votre registre npm privé. Si votre dépôt est hébergé avec npmjs.org, définissez ce champ sur registry.npmjs.org.
  • AUTH_TOKEN : jeton d'autorisation de votre registre npm. Il peut s'agir de la valeur de texte littéral du jeton, ou de la chaîne de texte ${NPM_TOKEN}, que npm va remplacer par la valeur réelle du jeton, fournie par l'environnement.

    Vous pouvez définir la variable d'environnement $NPM_TOKEN avec l'argument --set-build-env-vars sur votre commande gcloud functions deploy. Pour en savoir plus sur le jeton d'authentification NPM, consultez le tutoriel NPM sur les modules privés.

Créer votre fonction avec des dépendances fournies par le fournisseur

Les dépendances fournies sont celles dont la source est incluse directement dans votre package de code source et reconstruite avec votre propre code. Vous créez des dépendances Node.js fournies par le fournisseur et vous ne les installez pas lors du déploiement à l'aide de la variable d'environnement de compilation GOOGLE_VENDOR_NPM_DEPENDENCIES.

Prérequis pour les dépendances fournies par le fournisseur

  1. Assurez-vous de disposer d'une fonction opérationnelle avec toutes les dépendances que vous souhaitez spécifier dans le fournisseur définies dans votre fichier package.json.

  2. Installez ces dépendances localement en exécutant la commande suivante :

        npm install
    
  3. Supprimez node_modules du fichier .gcloudignore dans votre répertoire de travail.

  4. Déployez la fonction en vous assurant que votre version locale de Node.js est identique à celle que vous spécifiez lors du déploiement.

  5. Déployez votre fonction et les dépendances fournies par le fournisseur à l'aide de la commande suivante :

      gcloud functions deploy FUNCTION_NAME \
        --runtime RUNTIME_NAME \
        --set-build-env-vars GOOGLE_VENDOR_NPM_DEPENDENCIES=true
    

    Remplacez :

    • FUNCTION_NAME: nom de la fonction Cloud Functions que vous déployez.
    • RUNTIME_NAME : nom de l'environnement d'exécution Node.js dans lequel exécuter votre fonction déployée. Il doit s'agir de la même version de Node.js que celle utilisée dans votre environnement de développement local.

Le package du framework de fonctions est une dépendance requise pour les fonctions. Pour des compilations plus rapides, nous vous recommandons d'utiliser le vendoring. Si ce n'est pas le cas, il est téléchargé et installé lors de la création de votre fonction.

Si vous spécifiez un moteur npm dans le fichier package.json, la version de npm spécifiée est téléchargée au moment de la compilation. Pour supprimer ce comportement, supprimez le moteur de votre fichier package.json.