Hướng dẫn này cho bạn biết cách di chuyển các tiện ích của bạn từ môi trường Firebase Extensions ngừng hoạt động sang một hàm mà người dùng cài đặt và triển khai trong Cloud Functions của riêng họ cho toàn bộ mã nguồn Firebase (thế hệ thứ 2).
Đây là phương pháp di chuyển được đề xuất. Firebase sẽ duy trì danh sách các tiện ích có phiên bản tương đương chính thức trên npm; hướng dẫn này sẽ hướng dẫn bạn cách tạo tiện ích của riêng mình.
Trong suốt hướng dẫn này, tiện ích Truyền trực tuyến Firestore đến BigQuery (firestore-bigquery-export) được dùng làm ví dụ. Mỗi phần kết thúc bằng một Ví dụ minh hoạ cho thấy tiện ích đó trông như thế nào trước khi di chuyển và trông như thế nào sau khi di chuyển, dưới dạng gói @firebase/firestore-bigquery-export.
Đăng ký để nhận thêm thông tin và trợ giúp về việc di chuyển các tiện ích
Nếu có thắc mắc về cách di chuyển từ Firebase Extensions, bạn có thể liên hệ với chúng tôi theo địa chỉ firebase-extensions-migrator-support-external@google.com. Chúng tôi cũng sẽ gửi email cho nhóm này khi cập nhật hướng dẫn để cung cấp thêm thông tin về việc đóng gói, kiểm thử và phân phối các hàm thế hệ thứ 2.
Để tham gia nhóm này, hãy gửi tin nhắn đến firebase-extensions-migrator-support-external+subscribe@google.com. Nhóm sẽ phản hồi bằng một email yêu cầu tham gia. Bạn phải trả lời email đó, chứ không được nhấp vào nút "Tham gia nhóm này".
Trước khi bắt đầu
Để hoàn tất quá trình di chuyển này, bạn sẽ sử dụng các tính năng sau của Cloud Functions:
Cấu hình tham số hoá. Mỗi tham số mà bạn khai báo trong
extension.yamlsẽ trở thành một tham số được xác định trong mã gói của bạn.Các vai trò IAM khai báo và API bắt buộc. Mỗi vai trò mà bạn khai báo trong
extension.yamlsẽ trở thành một lệnh gọirequiresRole(...)và mỗi API sẽ trở thành một lệnh gọirequiresAPI(...)trong mã hàm của bạn. Tại thời điểm triển khai, CLI Firebase sẽ cấp các vai trò đã khai báo cho một tài khoản dịch vụ thời gian chạy được quản lý và thay bạn bật các API đã khai báo.Các sự kiện trong vòng đời cho cơ sở mã Cloud Functions. Giờ đây, cơ sở mã Cloud Functions hỗ trợ các sự kiện trong vòng đời tương tự như Firebase Extensions. Khai báo chế độ thiết lập khi cài đặt và khi cập nhật bằng các lệnh gọi vòng đời
afterFirstDeploy(...)vàafterRedeploy(...). Các phương thức này thay thế cholifecycleEventsmà bạn khai báo trongextension.yaml.
Kiểm kê tiện ích
Bắt đầu bằng cách lập danh mục tiện ích của bạn: một danh sách đầy đủ về mọi thứ mà tiện ích khai báo, vận chuyển và ghi lại, để mọi hành vi đều có một đích đến được xác định trong hàm thế hệ thứ 2 và không có gì bị mất trong quá trình di chuyển.
Hãy xem xét từng mục sau đây và ghi lại những gì bạn tìm thấy:
extension.yaml, khai báo các tham số, hàm, sự kiện, vai trò IAM, API bắt buộc, bí mật và lệnh gọi vòng đời.functions/, chứa mã hàm, các phần phụ thuộc, cấu hình bản dựng, trình kích hoạt và các hàm hàng đợi tác vụ.README.md,PREINSTALL.mdvàPOSTINSTALL.md, trong đó có các bước thiết lập, cảnh báo và ghi chú về việc thanh toán.scripts/, chứa mọi tiện ích nhập, bổ sung, IAM, sửa chữa hoặc di chuyển, cũng như mọi công cụ khác mà bạn cung cấp cùng với tiện ích.
Sau đó, đối với mỗi mục trong extension.yaml, hãy quyết định vị trí của mục đó trong gói npm:
Chuyển đổi cấu hình người dùng thành các tham số Cloud Functions (mục 5).
Chuyển đổi các bí mật thành bí mật Cloud Functions (mục 6).
Chuyển đổi các vai trò IAM thành khai báo
requiresRole(...)(mục 8).Chuyển đổi các API bắt buộc của Google thành các khai báo
requiresAPI(...)khi thích hợp (mục 8).Chuyển đổi các lệnh gọi cài đặt và cập nhật thành nội dung khai báo
afterFirstDeploy(...)vàafterRedeploy(...)(mục 8).
Ví dụ minh hoạ: Truyền trực tuyến Firestore đến BigQuery
Việc đọc firestore-bigquery-export/extension.yaml và các hàm sẽ tạo ra danh sách này:
| Trong extension.yaml | Số lượng / giá trị | Nơi dữ liệu được chuyển đến |
|---|---|---|
| params | 25 (COLLECTION_PATH, DATASET_ID, TABLE_ID, DATASET_LOCATION, VIEW_TYPE, …) | Tham số Cloud Functions (mục 5) |
| apis | bigquery.googleapis.com | requiresAPI(...) (mục 7) |
| vai trò | bigquery.dataEditor, datastore.user, bigquery.user | requiresRole(...) (mục 7) |
| tài nguyên | 1 trình kích hoạt sự kiện (fsexportbigquery) + các hàm hàng đợi tác vụ (initBigQuerySync, setupBigQuerySync) | Hàm gói đã xuất (mục 3) |
| lifecycleEvents | onInstall → initBigQuerySync; onUpdate / onConfigure → setupBigQuerySync | afterFirstDeploy / afterRedeploy (mục 9) |
| scripts/ | import/ (backfill), gen-schema-view/ | Được giữ lại dưới dạng tập lệnh (ngoài phạm vi ở đây) |
Tiện ích không khai báo loại nào: tham số bí mật, nên không có gì để di chuyển trong phần 6 của hướng dẫn này. Trình kích hoạt sự kiện đã là thế hệ thứ 2; chỉ các hàm hàng đợi tác vụ vẫn là thế hệ thứ 1 (có liên quan trong phần 3).
Cập nhật package.json
Cập nhật tệp package.json của tiện ích. Nếu bạn đang di chuyển một tiện ích, thì đây có thể là package.json gốc. Nếu bạn đang di chuyển nhiều tiện ích trong một kho lưu trữ, hãy cung cấp cho mỗi tiện ích một gói riêng.
Phiên bản SDK tối thiểu. Khai báo firebase-functions >= 7.3 và firebase-admin >= 14.2.0 làm phần phụ thuộc. Khai báo phiên bản firebase-functions của bạn dưới dạng một phần phụ thuộc ngang hàng
{
"name": "<package-name>",
"version": "1.0.0",
"main": "lib/index.js",
"types": "lib/index.d.ts",
"exports": {
".": {
"types": "./lib/index.d.ts",
"default": "./lib/index.js"
}
},
"engines": {
"node": ">=22"
},
"peerDependencies": {
"firebase-functions": "^7.3.0"
},
"dependencies": {
"firebase-functions": "^7.3.0",
"firebase-admin": "^14.2.0"
}
}
Khai báo firebase-functions làm phần phụ thuộc ngang hàng ngoài phần phụ thuộc thông thường, để dự án Cloud Functions của người dùng có cùng phiên bản SDK mà thư viện của bạn được viết.
Ví dụ minh hoạ: Truyền trực tuyến Firestore đến BigQuery
Trước. Các hàm/package.json của tiện ích là riêng tư, đặt tên cho mã nhận dạng tiện ích và khai báo firebase-functions làm một phần phụ thuộc trực tiếp:
{
"name": "firestore-bigquery-export",
"main": "lib/index.js",
"private": true,
"dependencies": {
"@firebaseextensions/firestore-bigquery-change-tracker": "^2.0.4",
"firebase-admin": "^14.2.0",
"firebase-functions": "^6.3.2"
}
}
Sau. Một gói có thể xuất bản: tên có phạm vi, bản đồ xuất và firebase-functions được chuyển đến peerDependencies:
{
"name": "@firebase/firestore-bigquery-export",
"version": "0.1.0",
"main": "lib/index.js",
"types": "lib/index.d.ts",
"exports": {
".": { "types": "./lib/index.d.ts", "default": "./lib/index.js" }, },
"engines": { "node": ">=22" },
"peerDependencies": { "firebase-functions": "^7.3.0" },
"dependencies": {
"@firebaseextensions/firestore-bigquery-change-tracker": "^2.0.4",
"firebase-admin": "^14.2.0",
"firebase-functions": "^7.3.0"
}
}
Nâng cấp các chức năng từ thế hệ thứ 1 lên thế hệ thứ 2
Nếu tiện ích của bạn vẫn xuất các hàm thế hệ thứ 1, hãy chuyển đổi từng hàm sang hàm tương đương thế hệ thứ 2. Nhập từ các mô-đun firebase-functions/... và truyền các chế độ cài đặt thời gian chạy trong các lựa chọn hàm.
Bạn có thể giảm thiểu nỗ lực viết lại bằng cách sử dụng tính năng phân tách cấu trúc sự kiện được vá thế hệ thứ 2 và tránh viết lại logic hàm vì SDK thế hệ thứ 2 hiện hiển thị các tham số V1 dưới dạng các trường trong đối tượng sự kiện, cho phép bạn sử dụng các tham số được phân tách cấu trúc/được đặt tên và giữ nguyên logic nghiệp vụ.
Trước. Thế hệ thứ 1:
import * as functions from "firebase-functions/v1";
export const sync = functions.firestore
.document("{collectionId}/{documentId}")
.onWrite(async (change, context) => {
await handleWrite(change.before, change.after, context.params);
});
Sau. Thế hệ thứ 2:
import { onDocumentWritten } from "firebase-functions/firestore";
export const syncV2 = onDocumentWritten(
{ document: "{collectionId}/{documentId}" },
async ({change,context}) =>
await handleWrite(change.before, change.after, context.params);
);
Hãy xem Cloud Functionsbảng so sánh phiên bản để biết danh sách đầy đủ các điểm khác biệt giữa hàm thế hệ thứ 1 và hàm thế hệ thứ 2.
Chuyển đổi các tham số và khoá bí mật của tiện ích
Thông số chuyển đổi
Mỗi tham số mà bạn khai báo trong extension.yaml sẽ trở thành một tham số Cloud Functions.
Chuyển đổi các chỉ số môi trường trực tiếp:
const collectionPath = process.env.COLLECTION_PATH;
vào các tham số Cloud Functions:
import { defineString } from "firebase-functions/params";
import { onDocumentWritten} from "firebase-functions/firestore";
const collectionPath = defineString("COLLECTION_PATH");
// Pass the param directly when used as a placeholder (e.g. trigger path)
export const sync = onDocumentWritten(
{ document: collectionPath },
async (event) => {
// Call .value() to read the string inside a handler
const path = collectionPath.value();
await handleWrite(path, event);
}
);
Sử dụng collectionPath.value() để đọc chuỗi bên trong một trình xử lý; sử dụng trực tiếp collectionPath ở nơi dự kiến có một phần giữ chỗ, chẳng hạn như đường dẫn kích hoạt hàm.
CLI Firebase sẽ khám phá các tham số của bạn và đọc giá trị của chúng từ .env, .env.projectId hoặc nhắc người dùng trong quá trình triển khai. Giữ nguyên tên tham số để các giá trị từ lượt cài đặt hiện có được chuyển sang.
Bạn không được thay đổi tên tham số đã khai báo trong mã của mình. Quá trình di chuyển tiện ích sẽ tự động giữ nguyên giá trị tham số hiện có của người dùng cuối, nhưng chỉ khi tên không thay đổi.
Ví dụ minh hoạ: Truyền trực tuyến Firestore đến BigQuery
Trước. Một tham số được khai báo trong extension.yaml, được đọc dưới dạng biến môi trường thô trong config.ts:
# extension.yaml
- param: COLLECTION_PATH
label: Collection path
type: string
required: true
// functions/src/config.ts
collectionPath: process.env.COLLECTION_PATH,
Sau. Một defineString; CLI sẽ phát hiện và đọc từ .env:
// src/config.ts
import { defineString } from "firebase-functions/params";
collectionPath: defineString("COLLECTION_PATH", {
label: "Collection path",
// We now support "nonEmpty: true" to ensure a value other than the empty string
// is entered, analagous to "required: true" in extensions.yaml
input: { text: { nonEmpty: true} }
}),
Tên tham số không thay đổi, nên tệp .env hiện có vẫn hoạt động.
Chuyển đổi giá trị bí mật
Trong extension.yaml, bạn khai báo các khoá bí mật bằng type: secret. Thời gian chạy Tiện ích sẽ lưu trữ và liên kết các tiện ích này, vì vậy mã tiện ích của bạn có thể đọc process.env.PARAM_NAME trực tiếp. Trong cơ sở mã Cloud Functions thông thường, bạn khai báo và liên kết từng khoá bí mật một cách rõ ràng:
import { defineSecret } from "firebase-functions/params";
import { onRequest } from "firebase-functions/https";
const apiKey = defineSecret("API_KEY");
export const fn = onRequest({ secrets: [apiKey] }, handler);
Sau khi tiện ích của bạn được di chuyển sang một gói/bộ công cụ npm, các thông tin tham chiếu bí mật sẽ được quản lý trong tệp .env của người dùng cuối. Bạn không được thay đổi tên bí mật được khai báo trong mã của mình dưới mọi hình thức. Trong quá trình di chuyển, các khoá bí mật của người dùng cuối sẽ được di chuyển theo.
Ví dụ minh hoạ: Kích hoạt email từ Cloud Firestore
Trước. MAIL_COLLECTION và SMTP_PASSWORD được đọc dưới dạng các biến môi trường thô trong config.ts:
# extension.yaml
- param: MAIL_COLLECTION
label: Email documents collection
type: string
default: mail
required: true
- param: SMTP_PASSWORD
label: SMTP password
type: secret
// functions/src/config.ts
mailCollection: process.env.MAIL_COLLECTION,
smtpPassword: process.env.SMTP_PASSWORD,
Sau. Một defineString và một defineSecret; CLI sẽ phát hiện cả hai và đọc từ .env
import { defineString, defineSecret } from "firebase-functions/params";
import { onDocumentWritten } from "firebase-functions/firestore";
const mailCollection = defineString("MAIL_COLLECTION",{ label: "Email documents collection",
default: "mail"
});
const smtpPassword = defineSecret("SMTP_PASSWORD", { label: "SMTP password" });
export const processQueue = onDocumentWritten(
{ document: `${mailCollection}/{documentId}`, secrets: [smtpPassword] },
async (event) => {
const collection = mailCollection.value();
const password = smtpPassword.value();
// ...
}
);
Di chuyển các lệnh gọi hàng đợi tác vụ nội bộ
Một số tiện ích xếp hàng công việc vào hàng đợi tác vụ riêng từ bên trong mã hàm của chúng, bằng cách sử dụng Firebase Admin SDK. Điều này khác với việc nhận một tác vụ được gửi đi (được đề cập trong các phần Nâng cấp các hàm và Chuyển đổi các hook vòng đời). Trong đó, mã của bạn là producer gọi queue.enqueue(...).
Các phiên bản trước của Admin SDK yêu cầu các tiện ích truyền mã nhận dạng phiên bản tiện ích của riêng chúng dưới dạng tham số thứ hai để nhắm đến một hàm Hàng đợi tác vụ trong cùng một tiện ích. Kể từ phiên bản 14.2.0 của `firebase-admin`, bạn không bắt buộc cũng như không nên dùng phương thức này. Theo mặc định, Task Queue API hiện sẽ nhắm đến các hàng đợi tác vụ trong cùng một bối cảnh (ví dụ: tiện ích). Bạn có thể yên tâm xoá tham số này trong mã của mình dưới dạng một hàm tiện ích và hàm độc lập. Việc xoá tham số này đảm bảo tính di động và khả năng tương thích trong tương lai.
Mọi thứ khác về lệnh gọi enqueue (xếp hàng) – đường dẫn tài nguyên locations/region/functions/name, tải trọng tác vụ và logic thử lại của bạn – vẫn giữ nguyên.
Hãy xem /docs/functions/task-functions để biết thêm thông tin chi tiết về việc xếp hàng các hàm bằng Cloud Tasks.
Trước. Tiện ích thế hệ thứ 1
import { getFunctions } from "firebase-admin/functions";
const queue = getFunctions().taskQueue(
`locations/${config.location}/functions/syncBigQuery`,
process.env.EXT_INSTANCE_ID, // extension instance ID, injected by the runtime
);
await queue.enqueue(taskData);
Sau. Tiện ích thế hệ thứ 2
import { getFunctions } from "firebase-admin/functions";
import { region } from "firebase-functions/params";
const queue = getFunctions().taskQueue(
`locations/${region.value()}/functions/syncBigQuery`);
await queue.enqueue(taskData);
Nếu lệnh gọi xếp hàng của bạn nhắm đến một cơ sở mã có tiền tố, thì tên hàm được phát hiện cũng có tiền tố (ví dụ: orders-syncBigQuery).
Khai báo các API và vai trò IAM bắt buộc
Di chuyển các yêu cầu về IAM và API của tiện ích ra khỏi extension.yaml và vào mã:
import { requiresAPI, requiresRole } from "firebase-functions"
requiresAPI("bigquery.googleapis.com", "Needed to write changelog rows");
requiresRole("roles/bigquery.dataEditor");
requiresRole("roles/bigquery.user");
Với tính năng bảo mật khai báo, CLI Firebase sẽ tạo hoặc cập nhật tài khoản dịch vụ thời gian chạy được quản lý cho toàn bộ mã nguồn và cấp cho tài khoản đó tất cả các vai trò đã khai báo. Tài liệu cho người dùng rằng tất cả các hàm trong cơ sở mã đều chạy với những vai trò đó, trừ phi API cuối cùng hỗ trợ một mô hình hẹp hơn.
Ví dụ minh hoạ: Truyền trực tuyến Firestore đến BigQuery
Trước. Được khai báo trong extension.yaml; thời gian chạy Tiện ích đã bật API và cấp vai trò cho một tài khoản được quản lý:
apis:
- apiName: bigquery.googleapis.com
roles:
- role: bigquery.dataEditor
- role: datastore.user
- role: bigquery.user
Sau. Khai báo trong mã bằng requiresAPI và requiresRole:
import { requiresAPI, requiresRole } from "firebase-functions/";
requiresAPI("bigquery.googleapis.com",
"Needed to write changelog rows and views");
requiresRole("roles/biguqery.dataEditor");
requiresRole("roles/datastore.user");
requiresRole("roles/bigquery.user");
Chuyển đổi các hook vòng đời
Ví dụ: nếu tiện ích của bạn gọi getExtensions().runtime(), chẳng hạn như setProcessingState hoặc setFatalError, hãy xoá những lệnh gọi đó vì chúng sẽ gây ra lỗi nếu được gọi từ một hàm thế hệ thứ 2 được triển khai bình thường. Trạng thái vòng đời hiện được điều khiển bằng afterFirstDeploy và afterRedeploy, trong đó không dùng tính năng theo dõi trạng thái này.
Firebase Extensions có thể chạy quy trình thiết lập khi người dùng cài đặt, cập nhật hoặc định cấu hình lại một tiện ích. Trong gói npm, hãy khai báo các thao tác tương đương trong vòng đời trong mã.
Đối với chế độ thiết lập một lần:
import { afterFirstDeploy } from "firebase-functions/lifecycle";
import { onTaskDispatched } from "firebase-functions/tasks";
export const runInitialSetup = onTaskDispatched(async (request) => {
await initializeResources(request.data);
});
afterFirstDeploy({
task: {
function: "runInitialSetup",
body: {}
}
});
Đối với nội dung cập nhật cấu hình hoặc mã:
import { afterRedeploy } from "firebase-functions/lifecycle";
afterRedeploy({
task: {
function: "runInitialSetup",
body: { reconcile: true }
}
});
Hãy đảm bảo các thao tác trong vòng đời của bạn là bất biến. Người dùng có thể cần chạy lại các quy trình này theo cách thủ công nếu quá trình gửi hoặc thực thi không thành công:
firebase functions:lifecycle:run afterFirstDeploy CODEBASE_NAME
firebase functions:lifecycle:run afterRedeploy CODEBASE_NAME
Ví dụ minh hoạ: Truyền trực tuyến Firestore đến BigQuery
Trước. lifecycleEvents trong extension.yaml, do thời gian chạy Tiện ích điều khiển:
lifecycleEvents:
onInstall:
function: initBigQuerySync
processingMessage: Configuring BigQuery Sync.
onUpdate:
function: setupBigQuerySync
processingMessage: Configuring BigQuery Sync
onConfigure:
function: setupBigQuerySync
processingMessage: Configuring BigQuery Sync
Sau. Được khai báo trong mã; các điều khoản của tác vụ BigQuery khi triển khai lần đầu:
import { afterFirstDeploy, afterRedeploy } from "firebase-functions/lifecycle";
afterFirstDeploy({ task: { function: "initBigQuerySync" } });
afterRedeploy({ task: { function: "setupBigQuerySync" } });
Việc cung cấp là bất biến, vì vậy, việc chạy lại sẽ điều chỉnh tập dữ liệu, bảng và khung hiển thị. Người dùng có thể chạy lại theo cách thủ công bằng firebase functions:lifecycle:run afterFirstDeploy CODEBASE_NAME.
Thiết lập tài liệu cho người dùng
Viết một
READMEgói giải thích, tối thiểu:Giá trị
.envmà gói yêu cầu.Các khoá bí mật mà gói yêu cầu và cách di chuyển các giá trị khoá bí mật hiện có.
Các vai trò IAM mà gói khai báo bằng
requiresRole(...).Các API của Google mà gói này cho phép hoặc yêu cầu.
Các lệnh gọi lại trong vòng đời mà gói khai báo và cách chạy lại các lệnh gọi lại đó theo cách thủ công.
Ghi chú về việc thanh toán.
Những thay đổi so với tiện ích gốc.
Ví dụ minh hoạ: Truyền trực tuyến Firestore đến BigQuery
Tệp README của gói sẽ gửi một bảng "nội dung thay đổi" cụ thể:
| Mối lo ngại | Dưới dạng tiện ích | Dưới dạng @firebase/firestore-bigquery-export |
|---|---|---|
| Config | Tham số của tiện ích | Các tham số của hàm thông qua .env |
| IAM | Do tiện ích cấp | requiresRole(...), được áp dụng khi triển khai |
| Cung cấp | Tác vụ trong vòng đời theo Tiện ích | tác vụ afterFirstDeploy / afterRedeploy |
| Tên hàm | ext-instanceId-fsexportbigquery | fsexportbigquery (có thể có tiền tố) |
Kiểm thử hàm thế hệ thứ 2
Giờ đây, bạn sẽ có một hàm thế hệ thứ 2. Khi được triển khai, hàm này sẽ hoạt động giống hệt như một bản cài đặt mới của tiện ích. Bước cuối cùng là xác minh và khắc phục mọi vấn đề vô tình xảy ra trong quá trình này.
Đảm bảo bạn đang sử dụng firebase-tools
>= 15.24.0 và triển khai hàm thế hệ thứ 2 đã chuyển đổi vào một dự án kiểm thử có các tài nguyên phù hợp để kiểm thử hành vi của hàm đó. Nếu bạn đã thiết lập một dự án kiểm thử từ việc kiểm thử tiện ích của mình, hãy dùng lệnh:
firebase deploy --only functions
Sau khi nhập lệnh này, hãy điền thông tin vào trình hướng dẫn xuất hiện, yêu cầu bạn nhập các giá trị tham số theo cách tương tự như cách bạn đã điền vào biểu mẫu cài đặt trong bảng điều khiển Firebase cho tiện ích.
Ví dụ minh hoạ: Truyền trực tuyến Firestore đến BigQuery
Chúng tôi xác minh quá trình đồng bộ hoá Cloud Firestore với BigQuery từ đầu đến cuối:
- Trong bảng điều khiển Cloud Firestore, hãy tạo bộ sưu tập mà bạn đặt làm COLLECTION_PATH (người dùng) nếu bộ sưu tập đó chưa tồn tại.
- Tạo một tài liệu có tên bigquery-mirror-test chứa mọi trường có bất kỳ giá trị nào.
- Trong bảng điều khiển BigQuery, hãy truy vấn bảng nhật ký thay đổi thô. Bảng này phải chứa một hàng duy nhất ghi lại quá trình tạo tài liệu:
SELECT * FROM `PROJECT_ID.analytics.users_raw_changelog`
- Truy vấn chế độ xem mới nhất. Thao tác này sẽ trả về sự kiện thay đổi mới nhất cho tài liệu duy nhất hiện có:
bigquery-mirror-test
SELECT * FROM `PROJECT_ID.analytics.users_raw_latest`
- Xoá tài liệu
bigquery-mirror-testtrong Cloud Firestore. Sự kiện này sẽ biến mất khỏi chế độ xem mới nhất và sự kiệnDELETEsẽ được thêm vào bảng nhật ký thay đổi thô.
Bạn có thể kiểm tra toàn bộ nhật ký của một tài liệu bằng cách:
SELECT *
FROM `PROJECT_ID.analytics.users_raw_changelog`
WHERE document_name = "bigquery-mirror-test"
ORDER BY timestamp ASC
Điểm khác biệt so với việc kiểm thử tiện ích:
- Trình kích hoạt triển khai dưới dạng
fsexportbigquery(có thể có tiền tố mã nguồn), chứ không phảiext-<instanceId>-fsexportbigquery. Tìm tên đó trong trang tổng quan và nhật ký Cloud Functions. - Giờ đây, mã của bạn sẽ chạy trong Firebase Local Emulator Suite dưới dạng các hàm bình thường. Bạn có thể đặt giá trị của các tham số để dùng trong trình mô phỏng bằng
.env.local. Bạn cũng có thể kiểm thử đơn vị mã của mình bằng firebase-functions-test SDK như mô tả trong phần Kiểm thử đơn vị Cloud Functions - Hoạt động cung cấp không còn được điều khiển bởi thời gian chạy Tiện ích nữa. Nếu bảng nhật ký thay đổi bị thiếu sau khi triển khai, hãy chạy lại tác vụ thiết lập theo cách thủ công:
firebase functions:lifecycle:run afterFirstDeploy CODEBASE_NAME. Tác vụ này là tác vụ bất biến, vì vậy, việc chạy lại tác vụ này sẽ điều chỉnh tập dữ liệu, bảng và chế độ xem. - Các giá trị tham số đến từ
.envchứ không phải biểu mẫu cài đặt, vì vậy, các lần chạy lạifirebase deploykhông tương tác sau khi.envhoàn tất.