Xử lý các phần phụ thuộc

Chọn ngôn ngữ: Node.js Python

Một hàm Cloud Functions có thể sử dụng các mô-đun bên ngoài và phần phụ thuộc cục bộ. Cách bạn chỉ định và quản lý các phần phụ thuộc sẽ tuỳ thuộc vào ngôn ngữ thời gian chạy của bạn.

Node.js

Hàm được phép sử dụng các mô-đun Node.js bên ngoài cũng như dữ liệu cục bộ. Các phần phụ thuộc trong Node.js được quản lý bằng npm và được thể hiện trong một tệp siêu dữ liệu có tên là package.json. Các thời gian chạy Node.js của Cloud Functions hỗ trợ việc cài đặt bằng npm, yarn hoặc pnpm.

Để chỉ định một phần phụ thuộc cho hàm, hãy thêm phần phụ thuộc đó vào tệp package.json.

Trong ví dụ này, một phần phụ thuộc được liệt kê trong tệp package.json:

{
  "dependencies": {
    "escape-html": "^1.0.3"
  }
}

Sau đó, phần phụ thuộc sẽ được nhập vào hàm:

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")}!`);
});

Bao gồm các mô-đun Node.js cục bộ

Bạn cũng có thể đưa các mô-đun Node.js cục bộ vào hàm. Bạn có thể đạt được điều này bằng cách khai báo mô-đun trong package.json bằng cách sử dụng tiền tố file:. Trong ví dụ sau, mymodule đề cập đến tên mô-đun của bạn và mymoduledir là thư mục chứa mô-đun:

{
  "dependencies": {
    "mymodule": "file:mymoduledir"
  }
}

Mã cho mô-đun cục bộ này phải được lưu trữ ở một nơi khác ngoài thư mục node_modules trong thư mục gốc của hàm.

Các bước bổ sung cho TypeScript

TypeScript sẽ giúp bạn nhiều nhất khi bạn sử dụng các thư viện có thông tin về kiểu. Điều này giúp TypeScript phát hiện lỗi cú pháp và giúp các trình chỉnh sửa đưa ra cho bạn các đề xuất tự động hoàn thành phù hợp hơn. Một số thư viện, chẳng hạn như firebase-adminfirebase-functions, đi kèm với các định nghĩa TypeScript.

Nhiều thư viện không cung cấp định nghĩa TypeScript riêng. Dự án DefinitelyTyped cung cấp các định nghĩa do cộng đồng duy trì cho các thư viện nút phổ biến nhất. DefinitelyTyped xuất bản các định nghĩa này theo cùng tên gói NPM, nhưng bên trong tổ chức "@types". Ví dụ: bạn có thể cài đặt thông tin loại cho thư viện uuid bằng cách sau:

npm install @types/uuid

Khi đã quen với TypeScript, bạn có thể kết hợp cả hai quy trình cài đặt:

npm install uuid @types/uuid

Phần phụ thuộc loại phải có cùng loại với phần phụ thuộc thư viện. Ví dụ: bạn không nên lưu uuid dưới dạng một phần phụ thuộc thông thường và @types/uuid dưới dạng một phần phụ thuộc dành cho nhà phát triển hoặc phần phụ thuộc ngang hàng.

Tải các mô-đun Node.js

Sử dụng hàm Node.js require() để tải mọi mô-đun Node.js mà bạn đã cài đặt. Bạn cũng có thể sử dụng hàm require() để nhập các tệp cục bộ mà bạn triển khai cùng với hàm của mình.

Nếu bạn đang viết các hàm bằng TypeScript, hãy sử dụng câu lệnh import theo cách tương tự để tải mọi mô-đun Node.js mà bạn đã cài đặt.

Sử dụng các mô-đun riêng tư

Bạn có thể sử dụng mô-đun npm riêng tư bằng cách cung cấp các chế độ cài đặt để xác thực với sổ đăng ký trong tệp .npmrc trong thư mục của hàm. Nếu bạn đang dùng Yarn phiên bản 2 trở lên làm trình quản lý gói, thì tệp này sẽ có tên là .yarnrc.yml.

Các mô-đun riêng tư trong Artifact Registry

Kho lưu trữ gói Artifact Registry Node.js có thể lưu trữ các mô-đun riêng tư cho hàm của bạn. Khi bạn triển khai một hàm Google Cloud Functions, quy trình xây dựng sẽ tự động tạo thông tin đăng nhập Artifact Registry cho tài khoản dịch vụ Cloud Build. Bạn chỉ cần liệt kê kho lưu trữ Artifact Registry trong .npmrc mà không cần tạo thêm thông tin đăng nhập. Ví dụ:

@SCOPE:registry=https://REGION_ID-npm.pkg.dev/PROJECT_ID/REPOSITORY_NAME
//REGION_ID-npm.pkg.dev/PROJECT_ID/REPOSITORY_NAME:always-auth=true

Phương pháp này cũng áp dụng cho trình quản lý gói Yarn phiên bản 1. Nếu đang sử dụng Yarn phiên bản 2 trở lên, bạn chỉ cần liệt kê kho lưu trữ Artifact Registry trong .yarnrc.yml mà không cần thông tin đăng nhập bổ sung. Ví dụ:

npmScopes:
  SCOPE:
    npmRegistryServer: https://REGION_ID-npm.pkg.dev/PROJECT_ID/REPOSITORY_NAME
    npmAlwaysAuth: true

Các mô-đun riêng tư trong các kho lưu trữ khác

Tài liệu npm giải thích cách tạo mã truy cập chỉ có thể đọc tuỳ chỉnh. Bạn không nên sử dụng tệp .npmrc được tạo trong thư mục chính vì tệp này chứa mã thông báo đọc-ghi. Bạn không cần có quyền ghi trong quá trình triển khai và quyền này có thể gây ra rủi ro bảo mật.

Đừng thêm tệp .npmrc nếu bạn không sử dụng kho lưu trữ riêng tư, vì tệp này có thể làm tăng thời gian triển khai cho các hàm của bạn.

Định dạng tệp

Nếu bạn đang sử dụng tệp .npmrc để đặt mã thông báo uỷ quyền tuỳ chỉnh, thì tệp đó phải có dòng như bên dưới.

//REGISTRY_DOMAIN/:_authToken=AUTH_TOKEN

Thay thế:

  • REGISTRY_DOMAIN: tên miền của sổ đăng ký npm riêng tư. Nếu kho lưu trữ của bạn được lưu trữ bằng npmjs.org, hãy đặt trường này thành registry.npmjs.org.
  • AUTH_TOKEN: mã thông báo uỷ quyền cho sổ đăng ký npm của bạn. Đây có thể là giá trị văn bản theo nghĩa đen của mã thông báo hoặc chuỗi văn bản ${NPM_TOKEN}npm thay thế bằng giá trị mã thông báo thực tế từ môi trường.

    Bạn có thể đặt biến môi trường $NPM_TOKEN bằng đối số --set-build-env-vars cho lệnh gcloud functions deploy. Hãy xem hướng dẫn về các mô-đun riêng tư trên NPM để biết thêm thông tin chi tiết về mã thông báo uỷ quyền NPM.


Python

Có hai cách để chỉ định các phần phụ thuộc cho Cloud Functions được viết bằng Python: sử dụng tệp requirements.txt của trình quản lý gói pip hoặc đóng gói các phần phụ thuộc cục bộ cùng với hàm của bạn.

Không hỗ trợ quy cách phần phụ thuộc bằng tiêu chuẩn Pipfile/Pipfile.lock. Dự án của bạn không được chứa các tệp này.

Chỉ định các phần phụ thuộc bằng pip

Các phần phụ thuộc trong Python được quản lý bằng pip và thể hiện trong một tệp siêu dữ liệu có tên là requirements.txt. Tệp này phải nằm trong cùng thư mục với tệp main.py chứa mã hàm của bạn.

Khi bạn triển khai hoặc triển khai lại hàm, Cloud Functions sẽ dùng pip để tải xuống và cài đặt phiên bản mới nhất của các phần phụ thuộc như được khai báo trong tệp requirements.txt. Tệp requirements.txt chứa một dòng cho mỗi gói. Mỗi dòng chứa tên gói và phiên bản được yêu cầu (không bắt buộc). Để biết thêm thông tin chi tiết, hãy xem requirements.txt.

Để ngăn bản dựng của bạn chịu ảnh hưởng của các thay đổi về phiên bản phần phụ thuộc, hãy cân nhắc việc ghim các gói phần phụ thuộc vào một phiên bản cụ thể.

Sau đây là một tệp requirements.txt mẫu:

functions-framework
requests==2.20.0
numpy

Đóng gói các phần phụ thuộc cục bộ

Bạn cũng có thể đóng gói và triển khai các phần phụ thuộc cùng với hàm của mình. Phương pháp này sẽ hữu ích nếu bạn không thể truy cập vào phần phụ thuộc thông qua trình quản lý gói pip hoặc nếu quyền truy cập Internet của môi trường Cloud Functions bị hạn chế.

Ví dụ: bạn có thể sử dụng một cấu trúc thư mục như sau:

myfunction/
├── main.py
└── localpackage/
    ├── __init__.py
    └── script.py

Sau đó, bạn có thể nhập mã như bình thường từ localpackage bằng câu lệnh import sau.

# Code in main.py
from localpackage import script

Xin lưu ý rằng phương pháp này sẽ không chạy bất kỳ tệp setup.py nào. Các gói có những tệp đó vẫn có thể được kết hợp, nhưng có thể không chạy đúng cách trên Cloud Functions.