Как обрабатывать зависимости

Выберите язык Node.js Python

Функция Cloud Functions может использовать внешние модули и локальные зависимости. Способ указания зависимостей и управления ими зависит от языка среды выполнения.

Node.js

Функция может использовать внешние модули Node.js, а также локальные данные. Зависимости в Node.js управляются с помощью npm и указываются в файле метаданных package.json. Среды выполнения Node.js в Cloud Functions поддерживают установку с помощью npm, yarn или pnpm.

Чтобы указать зависимость для функции, добавьте ее в файл package.json.

В этом примере зависимость указана в файле package.json:

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

Затем зависимость импортируется в функцию:

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

Как включить локальные модули Node.js

Вы также можете включить в функцию локальные модули Node.js. Для этого объявите модуль в package.json, используя префикс file:. В примере ниже mymodule – это название модуля, а mymoduledir – каталог, в котором он находится:

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

Код этого локального модуля должен храниться в папке, отличной от node_modules, в корневом каталоге функции.

Дополнительные действия для TypeScript

TypeScript наиболее полезен при использовании библиотек, содержащих информацию о типах. Это позволяет TypeScript обнаруживать ошибки синтаксиса, а редакторам – предлагать более подходящие варианты автозаполнения. Некоторые библиотеки, например firebase-admin и firebase-functions, поставляются с определениями TypeScript.

Многие библиотеки не предоставляют собственные определения TypeScript. Проект DefinitelyTyped предоставляет определения для самых популярных библиотек Node, поддерживаемые сообществом. DefinitelyTyped публикует эти определения под тем же названием пакета NPM, но в организации "@types". Например, вы можете установить информацию о типах для библиотеки uuid с помощью следующей команды:

npm install @types/uuid

По мере того как вы будете лучше разбираться в TypeScript, вы сможете использовать оба варианта установки:

npm install uuid @types/uuid

Зависимости типов должны быть того же типа, что и зависимость библиотеки. Например, не следует сохранять uuid как обычную зависимость, а @types/uuid – как зависимость для разработки или зависимость от однорангового узла.

Загрузка модулей Node.js

Используйте функцию Node.js require(), чтобы загрузить любой установленный модуль Node.js. Вы также можете использовать функцию require(), чтобы импортировать локальные файлы, развернутые вместе с функцией.

Если вы пишете функции на TypeScript, используйте оператор import, чтобы загрузить любой установленный модуль Node.js.

Как использовать частные модули

Вы можете использовать частный модуль npm, указав настройки для аутентификации в реестре в файле .npmrc в каталоге функции. Если вы используете Yarn версии 2 или более поздней в качестве менеджера пакетов, этот файл называется .yarnrc.yml.

Частные модули из Artifact Registry

В репозитории пакетов Node.js Artifact Registry можно размещать частные модули для вашей функции. При развертывании функции Google Cloud Functions процесс сборки автоматически создает учетные данные Artifact Registry для сервисного аккаунта Cloud Build. Вам нужно только указать репозиторий Artifact Registry в файле .npmrc, не создавая дополнительных учетных данных. Пример:

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

Этот подход также работает для менеджера пакетов Yarn v1. Если вы используете Yarn версии 2 или более поздней, вам нужно только указать репозиторий Artifact Registry в файле .yarnrc.yml без дополнительных учетных данных. Пример:

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

Частные модули из других репозиториев

В документации npm рассказывается, как создавать специальные токены доступа только для чтения. Мы не рекомендуем использовать файл .npmrc, созданный в домашнем каталоге, поскольку он содержит токен для чтения и записи. Разрешения на запись не требуются при развертывании и могут представлять угрозу безопасности.

Не включайте файл .npmrc, если вы не используете частные репозитории, так как это может увеличить время развертывания функций.

Формат файла

Если вы используете файл .npmrc для настройки специального токена аутентификации, он должен содержать строку, показанную ниже.

//REGISTRY_DOMAIN/:_authToken=AUTH_TOKEN

Заменить:

  • REGISTRY_DOMAIN – доменное имя вашего частного реестра npm. Если ваше хранилище размещено на сайте npmjs.org, задайте для этого поля значение registry.npmjs.org.
  • AUTH_TOKEN – токен авторизации для реестра npm. Это может быть текстовое значение токена или строка ${NPM_TOKEN}, которую npm заменяет на фактическое значение токена из среды.

    Вы можете задать переменную среды $NPM_TOKEN с помощью аргумента --set-build-env-vars команды gcloud functions deploy. Подробнее об этом токене можно узнать из руководства по частным модулям NPM.


Python

Зависимости для функции Cloud Functions, написанной на языке Python, можно указать двумя способами: с помощью файла requirements.txt менеджера пакетов pip или путем упаковки локальных зависимостей вместе с функцией.

Спецификация зависимостей с использованием стандарта Pipfile/Pipfile.lock не поддерживается. В проекте не должно быть этих файлов.

Как указать зависимости с помощью pip

Зависимости в Python управляются с помощью pip и указываются в файле метаданных requirements.txt. Этот файл должен находиться в том же каталоге, что и файл main.py с кодом функции.

При развертывании или повторном развертывании функции Cloud Functions использует pip для скачивания и установки последних версий зависимостей, указанных в файле requirements.txt. В файле requirements.txt каждая строка соответствует одному пакету. Каждая строка содержит название пакета и, при необходимости, запрошенную версию. Дополнительная информация приведена в requirements.txtсправочной статье.

Чтобы изменения версий зависимостей не влияли на сборку, закрепите пакеты зависимостей на определенной версии.

Ниже приведен пример файла requirements.txt:

functions-framework
requests==2.20.0
numpy

Как упаковать локальные зависимости

Вы также можете упаковать и развернуть зависимости вместе с функцией. Этот подход полезен, если зависимость недоступна через менеджер пакетов pip или если доступ к интернету в среде выполнения облачных функций ограничен.

Например, можно использовать следующую структуру каталогов:

myfunction/
├── main.py
└── localpackage/
    ├── __init__.py
    └── script.py

Затем вы можете импортировать код из localpackage, используя оператор import.

# Code in main.py
from localpackage import script

Обратите внимание, что при таком подходе не будут выполняться файлы setup.py. Пакеты с такими файлами можно объединять, но они могут работать неправильно на устройстве Cloud Functions.