سازماندهی عملکردهای متعدد


همانطور که توابع ابری را در پروژه خود ادغام می کنید، کد شما می تواند شامل بسیاری از توابع مستقل شود. ممکن است تعداد زیادی توابع داشته باشید که به طور منطقی در یک فایل قرار نگیرید، یا تیم های مختلف ممکن است گروه های مختلفی از توابع را مستقر کنند، که خطر بازنویسی یا حذف تصادفی عملکردهای تیم دیگر توسط یک تیم را ایجاد می کند. 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 نسخه 10.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

این تنظیمات با موارد استفاده زیر مطابقت دارد:

  • شما یک راه اندازی monorepo دارید و تیم های مختلف باید تعاریف عملکرد خود را در یک بسته ایزوله مدیریت کنند.
  • شما یک تابع با وابستگی خارجی سنگین و مقداردهی اولیه طولانی مدت دارید و می خواهید آن تابع را از سایر توابع حساس به تأخیر جدا کنید.

برای پشتیبانی از تنظیمات 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، ممکن است اولین عملکردهای خود را در یک فایل قرار دهید:

index.js

const functions = require('firebase-functions');
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');
exports.foo = functions.https.onRequest((request, response) => {
  // ...
});

bar.js

const functions = require('firebase-functions');
exports.bar = functions.https.onRequest((request, response) => {
  // ...
});

index.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!")

bar.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 : الزامی است، اما می تواند خالی باشد

توابع گروه

در بسیاری از پروژه ها، توابع را می توان به گروه های منطقی تقسیم کرد که باید با هم مستقر و نگهداری شوند. به عنوان مثال، ممکن است گروهی از توابع برای گزارش سنجه ها استفاده شود:

metrics.js


const functions = require('firebase-functions');
exports.usageStats = functions.https.onRequest((request, response) => {
  // ...
});
exports.nightlyReport = functions.https.onRequest((request, response) => {
  // ...
});

شما می توانید این توابع را هنگام صادرات در فایل index.js خود در یک گروه قرار دهید:

index.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

مراحل بعدی

برای کسب اطلاعات بیشتر در مورد توابع ابری، نگاه کنید به: