| Chọn lộ trình di chuyển: | Di chuyển sang các bộ công cụ hàm trên npm Di chuyển sang bộ công cụ hàm do chính bạn tạo |
Nếu nhà xuất bản chưa tạo một bộ thay thế chính thức được phân phối trên npm, thì hướng dẫn này sẽ hướng dẫn bạn các bước để phát triển nhánh tiện ích của họ và thiết lập tiện ích đó làm một bộ hàm cục bộ.
Kiểm tra các hạn chế đã biết về việc di chuyển
Trước khi bắt đầu di chuyển một phiên bản tiện ích, hãy kiểm tra xem chế độ thiết lập của bạn có sử dụng bất kỳ tính năng nào sau đây hay không. Những tính năng này yêu cầu giải pháp tạm thời hoặc chưa được hỗ trợ trong bộ công cụ chức năng:
- Kho lưu trữ Docker tuỳ chỉnh và khoá KMS yêu cầu giải pháp tạm thời thủ công Cloud Functions for Firebase không hỗ trợ các tham số hệ thống thay thế để định cấu hình kho lưu trữ Docker tuỳ chỉnh hoặc Khoá mã hoá do khách hàng quản lý (khoá KMS). Nếu tiện ích của bạn định cấu hình một trong hai tham số này, hãy tham khảo giải pháp thay thế trong phần Câu hỏi thường gặp.
Trước khi bắt đầu
Bạn cần thiết lập Firebase CLI và khởi động một dự án Firebase. Khi sử dụng CLI, hãy đảm bảo rằng bạn đang dùng phiên bản firebase-tools >= 15.32.0. Phiên bản này có các lệnh di chuyển và bộ hàm mới.
Các quyền và vai trò bắt buộc đối với tài khoản
Tuỳ thuộc vào những gì cần được tạo và định cấu hình bằng Firebase CLI trong quá trình di chuyển, tài khoản mà bạn đang dùng để xác thực bằng Firebase và Google Cloud phải có các vai trò sau:
roles/firebaseextensions.editorroles/cloudbuild.builds.editorroles/artifactregistry.writerroles/run.developerroles/iam.serviceAccountUserroles/iam.serviceAccountCreatorroles/cloudfunctions.admin(nếu bạn cần thực hiệnsetIamPermissionscho các điểm cuối công khai)roles/secretmanager.admin(nếu sử dụng bí mật)roles/serviceusage.serviceUsageAdmin(nếu bạn cần bật các API mới)
Bạn nên sử dụng một tài khoản đã cài đặt các tiện ích và triển khai các chức năng trước đó, vì hầu hết các quyền này sẽ được cấp. Nếu tài khoản mà bạn đang di chuyển cần có thêm vai trò, hãy làm theo hướng dẫn về IAM Google Cloud để thêm các vai trò đó.
Nâng cấp phiên bản tiện ích của bạn lên phiên bản mới nhất
Bạn phải cập nhật tiện ích lên phiên bản mới nhất để giảm thiểu sự khác biệt giữa phiên bản tiện ích và bộ thay thế của tiện ích. Nếu tiện ích của bạn chưa được nâng cấp, thì có thể có những thay đổi lớn, mang tính đột phá giữa phiên bản tiện ích và phiên bản thay thế bằng bộ công cụ. Cấu hình đã xuất có thể không khớp với cấu hình mà bộ công cụ mong đợi do các thông số thay đổi giữa các phiên bản.
Hãy dùng một trong các cách sau để cập nhật tiện ích, tuỳ thuộc vào nơi bạn đã cài đặt tiện ích:
- Trên bảng điều khiểnFirebase
- Từ CLI Firebase bằng cách sử dụng:
firebase ext:update <extension-instance-id> --project <project-id> firebase deploy --only extensions --project <project-id>
Nếu bạn bỏ qua bước này, CLI sẽ nhắc bạn nâng cấp khi xuất cấu hình nếu tiện ích của bạn không phải là phiên bản mới nhất.
Phát triển nhánh tiện ích thành một bộ hàm cục bộ
Trước khi bắt đầu chuyển đổi một tiện ích thành một bộ hàm cục bộ, hãy đảm bảo rằng mã nguồn tiện ích nằm trong dự án Firebase của bạn. Để thực hiện việc này, hãy sao chép kho lưu trữ tiện ích từ GitHub, tạo một thư mục bên trong thư mục gốc của dự án Firebase rồi sao chép thư mục functions/ và extension.yaml của tiện ích vào thư mục đó:
mkdir -p path/to/kit
cp -r /path/to/extension-source/functions/* path/to/kit/
cp /path/to/extension-source/extension.yaml path/to/kit/.
Làm theo các Bước 1 đến 8 trong hướng dẫn di chuyển dành cho nhà xuất bản để di chuyển mã nguồn tiện ích sang hàm thế hệ thứ 2. Sau đó, hãy tiếp tục thực hiện các bước sau.
Hãy đảm bảo bộ công cụ cục bộ của bạn hỗ trợ khu vực hàm được xuất và các tham số nâng cao
Trong một bộ hàm cục bộ, Firebase CLI không tạo tệp index.ts để thiết lập gói và định cấu hình gói đó để sử dụng các tham số hệ thống đã di chuyển.
Để sử dụng vùng hàm và các tham số nâng cao đã được định cấu hình cho tiện ích của bạn, hãy thiết lập tệp index.ts để đọc định dạng do firebase
ext:export --mode functions xuất vào tệp biến môi trường.
Cụ thể, trong tệp index.ts cấp cao nhất xuất các hàm của bạn, hãy xác định một tham số cho FUNCTION_DEFAULT_REGION và gọi setGlobalOptions bằng các biến môi trường có dạng EXT_MIGRATED_SYSTEM_<GLOBAL_OPTION>, tương tự như mẫu index-kit-migration.ts mà CLI dùng:
import { setGlobalOptions } from "firebase-functions";
import { MemoryOption, VpcEgressSetting, IngressSetting } from "firebase-functions/v2/options";
import { defineString } from "firebase-functions/params";
export const regionParam = defineString("FUNCTION_DEFAULT_REGION", {
input: { text: { nonEmpty: true } },
description: "Global default region where functions should be deployed. Can be overridden per-function.",
});
setGlobalOptions({
region: regionParam,
memory: (process.env.EXT_MIGRATED_SYSTEM_MEMORY as MemoryOption) ?? undefined,
timeoutSeconds: process.env.EXT_MIGRATED_SYSTEM_TIMEOUTSECONDS
? Number(process.env.EXT_MIGRATED_SYSTEM_TIMEOUTSECONDS)
: undefined,
vpcConnectorEgressSettings:
process.env.EXT_MIGRATED_SYSTEM_VPCCONNECTOREGRESSSETTINGS &&
process.env.EXT_MIGRATED_SYSTEM_VPCCONNECTOREGRESSSETTINGS !== "VPC_CONNECTOR_EGRESS_SETTINGS_UNSPECIFIED"
? (process.env.EXT_MIGRATED_SYSTEM_VPCCONNECTOREGRESSSETTINGS as VpcEgressSetting)
: undefined,
vpcConnector: process.env.EXT_MIGRATED_SYSTEM_VPCCONNECTOR ?? undefined,
maxInstances: process.env.EXT_MIGRATED_SYSTEM_MAXINSTANCES
? Number(process.env.EXT_MIGRATED_SYSTEM_MAXINSTANCES)
: undefined,
minInstances: process.env.EXT_MIGRATED_SYSTEM_MININSTANCES
? Number(process.env.EXT_MIGRATED_SYSTEM_MININSTANCES)
: undefined,
ingressSettings: (process.env.EXT_MIGRATED_SYSTEM_INGRESSSETTINGS as IngressSetting) ?? undefined,
// Parses a comma-separated string of key:value pairs into a key-value object
// (for example, "key1:value1,key2:value2" -> { key1: "value1", key2: "value2" }).
labels: process.env.EXT_MIGRATED_SYSTEM_LABELS
? process.env.EXT_MIGRATED_SYSTEM_LABELS.split(",").reduce<Record<string, string> | undefined>(
(acc, curr) => {
const [key, value] = curr.split(":");
const trimmedKey = key?.trim();
const trimmedValue = value?.trim();
if (!trimmedKey || !trimmedValue) {
return acc;
}
acc = acc ?? {};
acc[trimmedKey] = trimmedValue;
return acc;
},
undefined,
)
: undefined,
});
// Re-export all functions so the Firebase CLI can deploy them
export * from "./your-functions";
Kiểm thử bộ công cụ trước khi di chuyển
Giờ đây, bạn đã có một bộ hàm cục bộ. Khi được triển khai, bộ 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 tiếp theo 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 trước khi di chuyển các phiên bản tiện ích phát hành công khai sang đó.
Trước tiên, hãy thêm nhánh của bạn làm một bộ công cụ cục bộ, định cấu hình và triển khai nhánh đó vào một dự án thử nghiệm. Các bộ công cụ hàm cục bộ phải nằm trong dự án Firebase của bạn, vì vậy, nếu kho lưu trữ tiện ích được sao chép nằm bên ngoài dự án Firebase, hãy di chuyển kho lưu trữ đó vào thư mục dự án. Sau đó, hãy chạy lệnh cài đặt bộ công cụ sau để cài đặt bộ công cụ này dưới dạng một bộ công cụ cục bộ:
firebase functions:kits:install --directory <path-to-your-fork> --project <test-project-id>
Lệnh này hướng dẫn bạn chọn mã nhận dạng bộ công cụ, mã nhận dạng thực thể và cấu hình cho thực thể kiểm thử đầu tiên. Sau đó, nó sẽ sửa đổi tệp firebase.json để đăng ký một bộ công cụ cục bộ trỏ đến thư mục phân nhánh của bạn, với các cấu hình cho từng phiên bản được lưu trữ trong tệp .env tại function-kits/<kit-id>/config-<instance-id>.
Triển khai bộ công cụ cục bộ 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 bộ công cụ đó. 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 chạy lệnh sau:
firebase deploy --only functions:<kit-instance-id> --project <test-project-id>
Ví dụ minh hoạ: Truyền phát Cloud Firestore đến BigQuery
(firestore-bigquery-export)
Xác minh quá trình đồng bộ hoá Cloud Firestore với BigQuery theo phương thức mã hoá hai đầu:
- Trong trang Cloud Firestore của bảng điều khiển Firebase, hãy tạo bộ sưu tập mà bạn đặt làm
COLLECTION_PATH(users) nếu bộ sưu tập đó chưa tồn tại. - Tạo một tài liệu có tên là
bigquery-mirror-testchứa mọi trường có mọi giá trị. Trong trang BigQuery của bảng điều khiển Google Cloud, hãy truy vấn bảng nhật ký thay đổi thô. Tệp 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. Truy vấn 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 thử nghiệm tiện ích:
- Điều kiện kích hoạt triển khai dưới dạng
kit-<kit-instance-id>-fsexportbigquery, chứ không phảiext-<instanceId>-fsexportbigquery. Tìm tên đó trong trang tổng quan và nhật ký Cloud Functions. - Mã của bạn chạy trong Firebase Local Emulator Suite dưới dạng các hàm tiêu chuẩn. Bạn có thể đặt giá trị tham số để 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 SDKfirebase-functions-testnhư mô tả trong phần Kiểm thử đơn vị của Cloud Functions. - Quá trình 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 <kit-instance-id>. 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à khung hiển thị. - 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 có tính tương tác sau khi.envhoàn tất.
(Không bắt buộc) Dọn dẹp sau khi kiểm thử
Nếu muốn xoá thực thể kiểm thử này sau khi kiểm thử, hãy gỡ cài đặt thực thể đó:
firebase functions:kits:uninstall --instance <kit-instance-id> --project <test-project-id>
Thao tác này sẽ xoá tất cả tài nguyên trên đám mây được tạo bằng cách triển khai bộ công cụ và xoá cấu hình phiên bản của bộ công cụ. Nếu bạn chỉ có một phiên bản của bộ công cụ, thì thao tác này cũng sẽ xoá mục nhập bộ công cụ khỏi firebase.json. Thao tác này không xoá thư mục mã nguồn cục bộ của bạn. Khi cài đặt bộ công cụ để di chuyển dữ liệu sản xuất, bạn có thể chọn lại mã nhận dạng bộ công cụ.
Di chuyển từ các tiện ích sang bộ công cụ tại địa phương
Giờ đây, sau khi kiểm thử bộ công cụ cục bộ, bạn có thể di chuyển phiên bản tiện ích đang triển khai trực tiếp.
1. Cài đặt phiên bản bộ chức năng thay thế
Cài đặt bộ công cụ hàm cục bộ, truyền --no-configure để bỏ qua cấu hình thủ công để bước tiếp theo có thể xuất cấu hình tiện ích hiện có trực tiếp vào phiên bản bộ công cụ này:
firebase functions:kits:install --no-configure --directory <path-to-your-fork> --project <project-id>
2. Định cấu hình phiên bản bộ công cụ hàm giống hệt như tiện ích
Bạn cần tuỳ chỉnh phiên bản bộ công cụ này bằng một cấu hình giống hệt với tiện ích mà phiên bản này sẽ thay thế. Bạn có thể xuất cấu hình phiên bản tiện ích của mình vào một tệp .env. Tệp này lưu trữ dữ liệu cấu hình tham số, biến môi trường và tham chiếu bí mật cho tất cả Cloud Functions, bao gồm cả các bộ công cụ. Để xuất trực tiếp vào tệp cấu hình của bộ công cụ, hãy chạy:
firebase ext:export --mode functions --instance <extension-instance-id> --kit-instance <kit-instance-id> --project <project-id>
Khi kết thúc bước này, thông tin cấu hình cho phiên bản này sẽ được lưu trữ trong một tệp .env dành riêng cho dự án trong thư mục cấu hình phiên bản, chẳng hạn như:
function-kits/<kit-name>/config-<instance-id>/.env.<project-id>
3. Triển khai và xác minh việc thay thế bộ dụng cụ
Giờ đây, khi bộ công cụ đã được cài đặt và có sẵn dưới dạng một tập hợp các hàm, bạn có thể triển khai việc thay thế bộ công cụ. Bộ hàm hoạt động giống như các hàm tiêu chuẩn, trong đó mỗi phiên bản bộ hàm đóng vai trò là một toàn bộ mã nguồn riêng biệt để sắp xếp các hàm của bạn. Bạn có thể chọn triển khai tất cả các hàm hoặc chỉ một phiên bản bộ công cụ cụ thể. Trong khi di chuyển một phiên bản tiện ích duy nhất, hãy chỉ triển khai phiên bản bộ công cụ đó.
Nếu bộ công cụ của bạn sử dụng bất kỳ tham số mới nào không có trong phiên bản tiện ích mà bạn đã di chuyển, thì CLI Firebase sẽ nhắc bạn nhập các tham số đó khi bắt đầu quy trình triển khai. Điều này không được mong đợi trong ví dụ minh hoạ này từ một tiện ích firestore-bigquery-export mới nhất, nhưng nhiều bộ công cụ sẽ nhắc bạn nhập một tham số mới cho mọi nguồn kích hoạt sự kiện mà bộ công cụ sử dụng. Trong quá trình di chuyển này, các bộ công cụ được cập nhật sẽ sử dụng các hàm thế hệ thứ 2, trong khi các tiện ích trước đây sử dụng các hàm thế hệ thứ nhất. Trong thế hệ thứ 2, các hàm nằm gần nguồn sự kiện và được thêm dưới dạng một tham số bổ sung. Trong các bản cập nhật sau này, nếu bạn thêm các tham số mới, thì CLI sẽ nhắc bạn trong lần triển khai tiếp theo.
Ví dụ minh hoạ:
firebase deploy --only functions:firestore-bigquery-export --project my-project
Đầu ra:
=== Deploying to 'my-project'...
i deploying functions
i functions: Loaded environment variables from function-kits/firestore-bigquery-export/config-firestore-bigquery-export/.env.my-project
i functions: ensuring required API bigquery.googleapis.com is enabled...
i functions: ensuring required API cloudtasks.googleapis.com is enabled...
✔ functions: required APIs are enabled
i functions: granting declarative IAM roles to managed service account:
- BigQuery Data Editor
- BigQuery User
- Cloud Datastore User
- Eventarc Event Receiver
- roles/run.invoker
✔ functions: successfully granted IAM roles
i functions: creating Node.js 22 (2nd Gen) function kit-firestore-bigquery-export-fsexportbigquery(us-central1)...
i functions: creating Node.js 22 (2nd Gen) function kit-firestore-bigquery-export-initBigQuerySync(us-central1)...
i functions: creating Node.js 22 (2nd Gen) function kit-firestore-bigquery-export-setupBigQuerySync(us-central1)...
✔ functions[kit-firestore-bigquery-export-fsexportbigquery(us-central1)] Successful create operation.
✔ functions[kit-firestore-bigquery-export-initBigQuerySync(us-central1)] Successful create operation.
✔ functions[kit-firestore-bigquery-export-setupBigQuerySync(us-central1)] Successful create operation.
i functions: Executing afterFirstDeploy lifecycle hook targeting: kit-firestore-bigquery-export-initBigQuerySync...
✔ functions: Successfully queued task for lifecycle hook kit-firestore-bigquery-export-initBigQuerySync in queue projects/my-project/locations/us-central1/queues/kit-firestore-bigquery-export-initBigQuerySync.
✔ Deploy complete!
Để xác minh rằng firebase deploy của bộ công cụ không có lỗi, hãy kiểm tra nhật ký triển khai để xem có kích hoạt móc vòng đời nào không. Các tiện ích phổ biến, chẳng hạn như Stream Cloud Firestore to BigQuery, sử dụng các lệnh gọi lại trong vòng đời. Sau đây là ví dụ về cách một lệnh gọi lại vòng đời xuất hiện khi được kích hoạt:
i functions: Executing afterFirstDeploy lifecycle hook targeting: kit-firestore-bigquery-export-initBigQuerySync...
✔ functions: Successfully queued task for lifecycle hook kit-firestore-bigquery-export-initBigQuerySync in queue projects/my-project/locations/europe-west1/queues/kit-firestore-bigquery-export-initBigQuerySync.
i functions: View logs for afterFirstDeploy at: https://console.cloud.google.com/logs/query;query=resource.type%3D%22cloud_run_revision%22%0Aresource.labels.service_name%3D%22kit-firestore-bigquery-export--initbigquerysync%22%0Aresource.labels.location%3D%22europe-west1%22;project=my-project
Các thông báo nhật ký này xác nhận những điều sau:
- Đã tìm thấy và thực thi một lệnh gọi lại vòng đời.
- Một tác vụ đã được đưa vào hàng đợi trong hàng đợi tác vụ được liên kết của lệnh gọi lại vòng đời.
- Một đường liên kết đến Cloud Logging đã được cung cấp để bạn có thể xác thực rằng tác vụ đã hoàn tất mà không gặp lỗi.
Làm theo đường liên kết nhật ký đến bảng điều khiển Google Cloud để xác thực rằng không có lỗi nào trong nhật ký và sự kiện hàng đợi tác vụ của bạn đã được xử lý thành công. Nếu sự kiện trong vòng đời không thực thi thành công, bạn có thể kích hoạt lại bằng cách chạy:
firebase functions:lifecycle:run <hook-name> <codebase>
Nếu đây là lần đầu tiên bạn triển khai một thực thể của bộ công cụ hàm, hãy chạy:
firebase functions:lifecycle:run afterFirstDeploy <kit-instance-id>
Nếu quyết định dừng hoặc huỷ quá trình di chuyển này bất cứ lúc nào trong quá trình xác thực, bạn có thể gỡ cài đặt bộ công cụ theo hướng dẫn trong phần Gỡ cài đặt tiện ích.
4. Gỡ cài đặt tiện ích
Sau khi xác minh bộ chức năng đã triển khai, bạn có thể gỡ cài đặt tiện ích để không sao chép hành vi của tiện ích một lần cho bộ và một lần cho tiện ích. Bạn có thể gỡ cài đặt tất cả các tiện ích khỏi CLI Firebase bất kể bạn đã cài đặt chúng như thế nào nếu bạn truyền cờ --immediate:
firebase ext:uninstall <extension-instance-id> --project <project-id> --immediate
Ví dụ minh hoạ:
firebase ext:uninstall firestore-bigquery-export --project my-project --immediate
Đầu ra:
i extensions: uninstalling firestore-bigquery-export...
i extensions: deleting extension instance resources in project my-project...
✔ extensions: successfully uninstalled firestore-bigquery-export
Di chuyển nâng cao
Bạn có thể có các tiện ích trong nhiều dự án Firebase mà bạn muốn quản lý bằng một toàn bộ mã nguồn duy nhất. Ví dụ: nếu triển khai cùng một cơ sở hạ tầng cho môi trường testing và môi trường production, mỗi môi trường có một phiên bản documents Cloud Firestore mà bạn xuất sang BigQuery, thì bạn có thể đã cài đặt 2 phiên bản của tiện ích firestore-bigquery-export:
export-documents-testingexport-documents-production
Nếu bạn di chuyển 2 thực thể tiện ích này sang 2 thực thể bộ công cụ Functions trong một toàn bộ mã nguồn duy nhất khi làm việc với CLI Firebase và triển khai bằng firebase deploy --project testing và firebase deploy --project production, thì mỗi lần triển khai sẽ tạo 2 thực thể trong cả môi trường testing và production.
Thay vào đó, hãy thay thế 2 phiên bản tiện ích bằng một phiên bản bộ công cụ hàm firestore-bigquery-export được triển khai cho nhiều dự án, trong đó mỗi dự án có cấu hình riêng. Thư mục cấu hình cho phiên bản sẽ có dạng như sau:
config-export-documents/.env.testing.env.production
Mỗi lần triển khai đến testing và production sẽ tạo một phiên bản của bộ công cụ với cấu hình tương ứng. Các lệnh CLI hiện có sẽ tạo chế độ thiết lập này miễn là bạn truyền cờ --project trong mỗi lệnh gọi ext:migrate hoặc functions:kits:install.
Ví dụ minh hoạ:
firebase functions:kits:install --package @firebase-function-kits/firestore-bigquery-export --project testing --no-configure --template migration
✔ What would you like to name this kit? firestore-bigquery-export
✔ What would you like to name this instance? export-documents
✔ Wrote function-kits/firestore-bigquery-export/source/package.json
✔ Wrote function-kits/firestore-bigquery-export/source/tsconfig.json
✔ Wrote function-kits/firestore-bigquery-export/source/.gitignore
✔ Wrote function-kits/firestore-bigquery-export/source/src/index.ts
i functions: Running npm install
✔ Wrote configuration info to firebase.json
✔ functions: Function kit firestore-bigquery-export successfully installed.
# This creates the export-documents instance with an empty .env.testing file
# for the testing project. Now populate it via export:
firebase ext:export --mode functions --instance export-documents-testing \
--kit-instance export-documents --project testing
# Repeat the export for production into the same kit instance to create
# .env.production from the export-documents-prod instance:
firebase ext:export --mode functions --instance export-documents-prod \
--kit-instance export-documents --project production
Giờ đây, bạn đã có một thực thể duy nhất của bộ công cụ được định cấu hình để triển khai cho các dự án testing và production với cấu hình tương ứng. Nếu tạo một thực thể trong dự án testing và chạy lệnh functions:kits:install cho cùng một gói trong dự án production, bạn sẽ thấy lời nhắc có lựa chọn dùng lại thực thể được định cấu hình cho testing hoặc cài đặt thực thể thứ hai.