| Выберите язык: | 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.