При интеграции Cloud Functions в ваш проект ваш код может расшириться и содержать множество независимых функций. У вас может быть слишком много функций, чтобы разумно уместить их в один файл, или разные команды могут развертывать разные группы функций, создавая риск того, что одна команда перезапишет или случайно удалит функции другой команды. Cloud Functions предлагает различные способы организации вашего кода, чтобы упростить навигацию и обслуживание ваших функций.
Организация функций в кодовых базах
Вы можете использовать свойство codebase
объекта конфигурации функций в firebase.json
для управления большой коллекцией функций в нескольких репозиториях или подпакетах в рамках одной настройки репозитория monorepo:
# firebase.json
"functions": {
"codebase": "my-codebase"
# NOTE: Codebase must be less than 63 characters and can contain only
# lowercase letters, numeric characters, underscores, and dashes.
}
Свойство codebase
поддерживается в Firebase CLI v10.7.1 и выше.
Управление несколькими репозиториями
Свойство codebase
может помочь упростить управление несколькими репозиториями. Давайте рассмотрим случай, когда у вас есть два разных репозитория, которые развертывают функции в одном и том же проекте Firebase:
$ tree .
├── repoA
│ ├── firebase.json
│ └── functions
│ ├── index.js
│ └── package.json
└── repoB
├── firebase.json
└── functions
├── index.js
└── package.json
Без аннотаций кодовой базы Firebase CLI предложил бы вам удалить функции, определенные в другом репозитории, во время развертывания:
$ (cd repoA && firebase deploy --only functions)
...
i functions: preparing functions directory for uploading...
✔ functions: functions folder uploaded successfully
The following functions are found in your project but do not exist in your local source code:
fn1FromRepoB
fn2FromRepoB
...
? Would you like to proceed with deletion? Selecting no will continue the rest of the deployments. (y/N)
Эту проблему можно обойти, добавив уникальную аннотацию кодовой базы в раздел конфигурации функций firebase.json
в каждом репозитории проекта:
# repoA/firebase.json
"functions": {
"codebase": "repo-a"
}
# repoB/firebase.json
"functions": {
"codebase": "repo-b"
}
Благодаря аннотации кодовой базы Firebase CLI больше не предлагает вам удалять функции, определенные за пределами вашего непосредственного репозитория:
$ (cd repoA && firebase deploy --only functions)
...
i functions: preparing functions directory for uploading...
✔ functions: functions folder uploaded successfully
# Gleefully ignores functions from repoB
i functions: creating Node.js 16 function fnFromRepoA (us-central1)...
✔ Deploy Complete!
Управление несколькими исходными пакетами (monorepo)
Свойство codebase
может помочь упростить управление несколькими исходными пакетами в одном репозитории. Давайте рассмотрим случай, когда у вас есть каталог проекта firebase с определениями функций, распределенными по нескольким подпакетам:
$ tree .
├── firebase.json
├── teamA
│ ├── index.js
│ └── package.json
└── teamB
├── index.js
└── package.json
Эта настройка подходит для следующих вариантов использования:
- У вас настроен монорепозиторий , и разные команды управляют собственными определениями функций в изолированном пакете.
- У вас есть функция с большой внешней зависимостью и длительной инициализацией, и вы хотите изолировать эту функцию от других функций, чувствительных к задержке.
Для поддержки такой настройки monrepo определите конфигурации нескольких функций в firebase.json
:
"functions": [
{
"source": "teamA",
"codebase": "team-a"
},
{
"source": "teamB",
"codebase": "team-b"
},
]
При такой конфигурации Firebase CLI развертывает функции из всех пакетов с помощью одной команды развертывания:
$ firebase deploy --only functions
i deploying functions
i functions: preparing codebase team-a for deployment
i functions: preparing codebase team-b for deployment
i functions: creating Node.js 16 function team-a:helloATeam(us-central1)...
i functions: creating Node.js 16 function team-b:helloBTeam(us-central1)...
...
Вы также можете развернуть определенную кодовую базу:
$ firebase deploy --only functions:team-b
i deploying functions
i functions: preparing codebase team-b for deployment
i functions: updating Node.js 16 function team-b:helloBTeam(us-central1)...
...
Запись функций в несколько файлов
Приступая к работе с Cloud Functions вы можете поместить свои первые несколько функций в один файл:
индекс.js
const functions = require('firebase-functions/v1');
exports.foo = functions.https.onRequest((request, response) => {
// ...
});
exports.bar = functions.https.onRequest((request, response) => {
// ...
});
main.py
from firebase_functions import https_fn
@https_fn.on_request()
def foo(req: https_fn.Request) -> https_fn.Response:
return https_fn.Response("Hello foo!")
@https_fn.on_request()
def bar(req: https_fn.Request) -> https_fn.Response:
return https_fn.Response("Hello bar!")
Это может стать сложным для управления с большим количеством функций. Вместо этого вы можете поместить всю вашу логику для каждой функции в ее собственный файл и использовать ваш исходный файл как список экспортов:
Node.js
foo.js
const functions = require('firebase-functions/v1'); exports.foo = functions.https.onRequest((request, response) => { // ... });
бар.js
const functions = require('firebase-functions/v1'); exports.bar = functions.https.onRequest((request, response) => { // ... });
индекс.js
const foo = require('./foo'); const bar = require('./bar'); exports.foo = foo.foo; exports.bar = bar.bar;
Питон
foo.py
from firebase_functions import https_fn
@https_fn.on_request()
def foo(req: https_fn.Request) -> https_fn.Response:
return https_fn.Response("Hello foo!")
бар.py
from firebase_functions import https_fn
@https_fn.on_request()
def bar(req: https_fn.Request) -> https_fn.Response:
return https_fn.Response("Hello foo!")
main.py
from fn_impl.foo import *
from fn_impl.bar import *
Эта настройка предполагает следующую структуру каталогов проекта:
my-project
├── firebase.json
└── functions
├── fn_impl
│ ├── __init__.py
│ ├── foo.py
│ └── bar.py
├── main.py
└── requirements.txt
fn_impl
: Может иметь любое имя
__init__.py
: Обязательно, но может быть пустым
Групповые функции
Во многих проектах функции можно разделить на логические группы, которые должны быть развернуты и поддерживаться вместе. Например, у вас может быть группа функций, используемых для отчетности по метрикам:
метрики.js
const functions = require('firebase-functions/v1'); exports.usageStats = functions.https.onRequest((request, response) => { // ... }); exports.nightlyReport = functions.https.onRequest((request, response) => { // ... });
Вы можете объединить эти функции в группу при экспорте их в файл index.js
:
индекс.js
// Export both functions from metrics.js in the "metrics" group: // - metrics-usageStats // - metrics-nightlyReport exports.metrics = require('./metrics');
При развертывании функции будут иметь префикс в виде имени своей группы, поэтому в этом примере функции будут называться metrics-usageStats
и metrics-nightlyReport
.
При развертывании функций вы можете ограничить действие одной группой:
firebase deploy --only functions:metrics
Следующие шаги
Чтобы узнать больше о Cloud Functions , см.: