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

Выберите язык: 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 можно найти в руководстве по частным модулям 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 или если доступ к интернету в среде Cloud Functions ограничен.

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

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

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

# Code in main.py
from localpackage import script

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