Manejo de dependencias


Una función puede utilizar módulos externos de Node.js, así como datos locales. Las dependencias en Node.js se administran con npm y se expresan en un archivo de metadatos llamado package.json . Los tiempos de ejecución de Cloud Functions Node.js admiten la instalación mediante npm , Yarn o pnpm .

Para especificar una dependencia para su función, agréguela a su archivo package.json .

En este ejemplo, se enumera una dependencia en el archivo package.json :

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

Luego, la dependencia se importa en la función:

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')}!`);
}

Incluyendo módulos locales de Node.js

También puede incluir módulos locales de Node.js como parte de su función. Puede lograr esto declarando su módulo en package.json usando el file: prefijo . En el siguiente ejemplo, mymodule se refiere al nombre de su módulo y mymoduledir es el directorio que contiene su módulo:

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

El código para este módulo local debe almacenarse en algún lugar que no sea la carpeta node_modules dentro del directorio raíz de su función.

Pasos adicionales para TypeScript

TypeScript le ayuda más cuando utiliza bibliotecas que tienen información de tipo. Esto permite que TypeScript detecte errores de sintaxis y permite a los editores brindarle mejores sugerencias de autocompletar. Algunas bibliotecas, como firebase-admin y firebase-functions , se envían con definiciones de TypeScript incluidas.

Muchas bibliotecas no proporcionan su propia definición de TypeScript. El proyecto DefinitelyTyped proporciona definiciones mantenidas por la comunidad para las bibliotecas de nodos más populares. DefinitelyTyped publica estas definiciones con el mismo nombre de paquete NPM, pero dentro de la organización "@types". Por ejemplo, puede instalar la información de tipo para la biblioteca uuid con lo siguiente:

npm install @types/uuid

A medida que te familiarices con TypeScript, es posible que te encuentres combinando ambas instalaciones:

npm install uuid @types/uuid

Las dependencias de tipo deben ser del mismo tipo que la dependencia de la biblioteca. Por ejemplo, no debe guardar uuid como una dependencia normal y @types/uuid como una dependencia de desarrollo o de pares.

Cargando módulos de Node.js

Utilice la función require() de Node.js para cargar cualquier módulo de Node.js que haya instalado. También puede utilizar la función require() para importar archivos locales que implemente junto con su función.

Si está escribiendo funciones en TypeScript, use la declaración import de la misma manera para cargar cualquier módulo de Node.js que haya instalado.

Usando módulos privados

Puede utilizar un módulo npm privado proporcionando configuraciones para la autenticación con el registro en un archivo .npmrc en el directorio de la función. Si está utilizando Yarn v2 o superior como administrador de paquetes, este archivo se llama .yarnrc.yml .

Módulos privados de Artifact Registry

Un repositorio de paquetes Artifact Registry Node.js puede alojar módulos privados para su función. Cuando implementas una función de Google Cloud Functions, el proceso de compilación genera automáticamente credenciales de Artifact Registry para la cuenta del servicio Cloud Build . Solo necesita incluir el repositorio de Artifact Registry en su .npmrc sin generar credenciales adicionales. Por ejemplo:

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

Este enfoque también funciona para el administrador de paquetes Yarn v1. Si está utilizando Yarn v2 o superior, solo necesita incluir el repositorio de Artifact Registry en su .yarnrc.yml sin credenciales adicionales. Por ejemplo:

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

Módulos privados de otros repositorios

La documentación de npm explica cómo crear tokens de acceso personalizados de solo lectura. No recomendamos el uso del archivo .npmrc creado en el directorio de inicio porque contiene un token de lectura y escritura. No se requieren permisos de escritura durante la implementación y podrían suponer un riesgo para la seguridad.

No incluya el archivo .npmrc si no utiliza repositorios privados, ya que puede aumentar el tiempo de implementación de sus funciones.

Formato de archivo

Si está utilizando un archivo .npmrc para configurar un token de autenticación personalizado, debe incluir la línea que se muestra a continuación.

//REGISTRY_DOMAIN/:_authToken=AUTH_TOKEN

Reemplazar:

  • REGISTRY_DOMAIN : el nombre de dominio de su registro npm privado. Si su repositorio está alojado en npmjs.org , establezca este campo en registry.npmjs.org .
  • AUTH_TOKEN : el token de autorización para su registro npm. Puede ser el valor de texto literal del token o la cadena de texto ${NPM_TOKEN} , que npm reemplaza con el valor del token real del entorno.

    Puedes configurar la variable de entorno $NPM_TOKEN con el argumento --set-build-env-vars en tu comando gcloud functions deploy . Consulte el tutorial de NPM sobre módulos privados para obtener más detalles sobre el token de autenticación de NPM.

Construya su función con dependencias proporcionadas

Las dependencias proporcionadas son aquellas cuyo código fuente se incluye directamente en su paquete de código fuente y se reconstruye junto con su propio código. Usted crea dependencias suministradas de Node.js y omite su instalación durante la implementación mediante la variable de entorno de compilación GOOGLE_VENDOR_NPM_DEPENDENCIES.

Requisitos previos para las dependencias proporcionadas

  1. Asegúrese de tener una función funcional con todas las dependencias que desea que el proveedor defina en su archivo package.json .

  2. Instale estas dependencias localmente ejecutando

        npm install
  3. Elimine node_modules del archivo .gcloudignore en su directorio de trabajo.

  4. Implemente la función, asegurándose de que su versión local de Node.js sea la misma que la que especificó durante la implementación.

  5. Implemente su función y las dependencias proporcionadas con el siguiente comando:

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

    Reemplazar:

    • FUNCTION_NAME : el nombre de la función de Cloud Functions que estás implementando
    • RUNTIME_NAME : el nombre del tiempo de ejecución de Node.js bajo el cual ejecutar la función implementada. Esta debe ser la misma versión de Node.js que usó en su entorno de desarrollo local.

El paquete de marco de funciones es una dependencia necesaria para las funciones. Para compilaciones más rápidas, recomendamos vender este paquete. Si no lo hace, se descarga e instala cuando se crea la función.

Si especifica un motor npm en el archivo package.json, la versión especificada de npm se descarga en el momento de la compilación. Para suprimir este comportamiento, elimínelo de su archivo package.json.