| เลือกภาษา: | Node.js Python |
ฟังก์ชัน Cloud Functions สามารถใช้โมดูลภายนอกและทรัพยากร Dependency ในเครื่องได้ วิธีระบุและจัดการทรัพยากร Dependency จะขึ้นอยู่กับภาษาของรันไทม์
Node.js
ฟังก์ชันได้รับอนุญาตให้ใช้โมดูล Node.js ภายนอกและข้อมูลในเครื่อง
การจัดการการขึ้นต่อกันใน Node.js จะทำด้วย npm และแสดงใน
ไฟล์ข้อมูลเมตาที่ชื่อ package.json รันไทม์ Node.js ของ Cloud Functions รองรับการติดตั้งโดยใช้ npm, yarn หรือ pnpm
หากต้องการระบุทรัพยากร Dependency สำหรับฟังก์ชัน ให้เพิ่มลงในไฟล์ package.json
ในตัวอย่างนี้ ระบบจะแสดงทรัพยากร Dependency ในไฟล์ package.json ดังนี้
{ "dependencies": { "escape-html": "^1.0.3" } }
จากนั้นจะมีการนำเข้าทรัพยากร Dependency ในฟังก์ชัน
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")}!`);
});
รวมถึงโมดูล Node.js ในเครื่อง
นอกจากนี้ คุณยังรวมโมดูล Node.js ในเครื่องเป็นส่วนหนึ่งของฟังก์ชันได้ด้วย คุณทำได้โดยประกาศโมดูลใน package.json โดยใช้คำนำหน้า file: ในตัวอย่างต่อไปนี้ mymodule หมายถึงชื่อโมดูลและ mymoduledir คือ
ไดเรกทอรีที่มีโมดูล
{ "dependencies": { "mymodule": "file:mymoduledir" } }
โค้ดสำหรับโมดูลภายในเครื่องนี้ควรจัดเก็บไว้ที่อื่นที่ไม่ใช่โฟลเดอร์
node_modules ภายในไดเรกทอรีรากของฟังก์ชัน
ขั้นตอนเพิ่มเติมสำหรับ TypeScript
TypeScript จะช่วยคุณได้มากที่สุดเมื่อใช้ไลบรารีที่มีข้อมูลประเภท
ซึ่งช่วยให้ TypeScript ตรวจจับข้อผิดพลาดทางไวยากรณ์และช่วยให้เอดิเตอร์ให้คำแนะนำการเติมข้อความอัตโนมัติได้ดียิ่งขึ้น
ไลบรารีบางรายการ เช่น firebase-admin และ
firebase-functions จะมาพร้อมกับคำจำกัดความของ TypeScript
ไลบรารีจำนวนมากไม่ได้ให้คำจำกัดความ TypeScript ของตนเอง โปรเจ็กต์ DefinitelyTyped
มีคำจำกัดความที่ชุมชนดูแลสำหรับไลบรารี Node ยอดนิยม
DefinitelyTyped จะเผยแพร่คำจำกัดความเหล่านี้ภายใต้ชื่อแพ็กเกจ NPM เดียวกัน แต่
ภายในองค์กร "@types" เช่น คุณสามารถติดตั้งข้อมูลประเภท
สำหรับuuidไลบรารีด้วยคำสั่งต่อไปนี้
npm install @types/uuid
เมื่อคุ้นเคยกับ TypeScript มากขึ้น คุณอาจพบว่าตัวเองใช้การติดตั้งทั้ง 2 แบบร่วมกัน
npm install uuid @types/uuid
ทรัพยากร Dependency ประเภทควรเป็นชนิดเดียวกับทรัพยากร Dependency ไลบรารี เช่น คุณไม่ควรบันทึก uuid เป็นทรัพยากร Dependency ตามปกติ และ @types/uuid เป็นทรัพยากร Dependency ของนักพัฒนาซอฟต์แวร์หรือทรัพยากร Dependency แบบแอปเทียบเท่า
การโหลดโมดูล Node.js
ใช้ฟังก์ชัน Node.js
require()
เพื่อโหลดโมดูล Node.js ที่คุณติดตั้งไว้ นอกจากนี้ คุณยังใช้ฟังก์ชัน
require() เพื่อนำเข้าไฟล์ในเครื่องที่ติดตั้งใช้งานพร้อมกับฟังก์ชันได้ด้วย
หากคุณเขียนฟังก์ชันใน TypeScript ให้ใช้คำสั่ง
import
ในลักษณะเดียวกันเพื่อโหลดโมดูล Node.js ที่คุณติดตั้งไว้
การใช้โมดูลส่วนตัว
คุณใช้โมดูล npm ส่วนตัวได้โดยระบุการตั้งค่าสำหรับการตรวจสอบสิทธิ์กับ
รีจิสทรีในไฟล์ .npmrc ในไดเรกทอรีของฟังก์ชัน หากคุณใช้
Yarn v2 ขึ้นไปเป็นเครื่องมือจัดการแพ็กเกจ ไฟล์นี้จะมีชื่อว่า
.yarnrc.yml
โมดูลส่วนตัวจาก Artifact Registry
ที่เก็บแพ็กเกจ Node.js ของ Artifact Registry
สามารถโฮสต์โมดูลส่วนตัวสำหรับฟังก์ชันของคุณได้ เมื่อคุณติดตั้งใช้งานฟังก์ชัน Google Cloud Functions
กระบวนการบิลด์จะสร้างข้อมูลเข้าสู่ระบบของ Artifact Registry
โดยอัตโนมัติสำหรับบัญชีบริการของ Cloud Build
คุณเพียงแค่ต้องแสดงรายการที่เก็บ Artifact Registry ใน .npmrc โดยไม่ต้องสร้างข้อมูลเข้าสู่ระบบเพิ่มเติม เช่น
@SCOPE:registry=https://REGION_ID-npm.pkg.dev/PROJECT_ID/REPOSITORY_NAME
//REGION_ID-npm.pkg.dev/PROJECT_ID/REPOSITORY_NAME:always-auth=true
แนวทางนี้ใช้ได้กับเครื่องมือจัดการแพ็กเกจ Yarn v1 ด้วย
หากใช้ Yarn เวอร์ชัน 2 ขึ้นไป คุณเพียงแค่ต้องแสดงรายการที่เก็บ Artifact Registry ใน .yarnrc.yml โดยไม่ต้องใช้ข้อมูลเข้าสู่ระบบเพิ่มเติม
เช่น
npmScopes:
SCOPE:
npmRegistryServer: https://REGION_ID-npm.pkg.dev/PROJECT_ID/REPOSITORY_NAME
npmAlwaysAuth: true
โมดูลส่วนตัวจากที่เก็บอื่นๆ
เอกสารประกอบของ npm อธิบายวิธีสร้างโทเค็นเพื่อการเข้าถึงแบบอ่านอย่างเดียวที่กำหนดเอง
เราไม่แนะนำให้ใช้ไฟล์ .npmrc ที่สร้างในไดเรกทอรีหน้าแรก
เนื่องจากมีโทเค็นอ่าน-เขียน ไม่จำเป็นต้องมีสิทธิ์เขียนในระหว่างการติดตั้งใช้งาน และอาจก่อให้เกิดความเสี่ยงด้านความปลอดภัย
อย่าใส่ไฟล์ .npmrc หากไม่ได้ใช้ที่เก็บส่วนตัว
เนื่องจากอาจทำให้เวลาในการติดตั้งใช้งานฟังก์ชันนานขึ้น
รูปแบบไฟล์
หากคุณใช้ไฟล์ .npmrc เพื่อตั้งค่าโทเค็นการให้สิทธิ์ที่กำหนดเอง ไฟล์ดังกล่าวควรมีบรรทัดที่แสดงด้านล่าง
//REGISTRY_DOMAIN/:_authToken=AUTH_TOKEN
แทนที่:
- REGISTRY_DOMAIN: ชื่อโดเมนของรีจิสทรี npm ส่วนตัว
หากที่เก็บของคุณโฮสต์ด้วย
npmjs.orgให้ตั้งค่าฟิลด์นี้เป็นregistry.npmjs.org AUTH_TOKEN: โทเค็นการให้สิทธิ์สำหรับรีจิสทรี npm ซึ่งอาจเป็นค่าข้อความตามตัวอักษรของโทเค็นหรือสตริงข้อความ
${NPM_TOKEN}ซึ่งnpmจะแทนที่ด้วยค่าโทเค็นจริงจาก สภาพแวดล้อมคุณตั้งค่า
$NPM_TOKENตัวแปรสภาพแวดล้อมด้วยอาร์กิวเมนต์--set-build-env-varsในคำสั่งgcloud functions deployดูรายละเอียดเพิ่มเติมเกี่ยวกับโทเค็นการตรวจสอบสิทธิ์ NPM ได้ที่บทแนะนำ NPM เกี่ยวกับโมดูลส่วนตัว
Python
การระบุทรัพยากร Dependency สำหรับCloud Functionsฟังก์ชันที่เขียนด้วย
Python มี 2 วิธี ได้แก่ การใช้ไฟล์
requirements.txt ของตัวจัดการแพ็กเกจ pip หรือการจัดแพ็กเกจทรัพยากร Dependency ในเครื่องพร้อมกับฟังก์ชัน
ไม่รองรับการระบุการขึ้นต่อกันโดยใช้มาตรฐาน Pipfile/Pipfile.lock โปรเจ็กต์ของคุณไม่ควรมีไฟล์เหล่านี้
การระบุทรัพยากร Dependency ด้วย pip
การจัดการการขึ้นต่อกันใน Python จะทำด้วย pip และแสดงในไฟล์ข้อมูลเมตา
ที่ชื่อ
requirements.txt
ไฟล์นี้ต้องอยู่ในไดเรกทอรีเดียวกับไฟล์ main.py ที่มีโค้ดฟังก์ชัน
เมื่อคุณติดตั้งใช้งานหรือติดตั้งฟังก์ชันอีกครั้ง Cloud Functions
จะใช้ pip เพื่อดาวน์โหลดและติดตั้งเวอร์ชันล่าสุดของ
การขึ้นต่อกันตามที่ประกาศไว้ในไฟล์ requirements.txt
requirements.txt ไฟล์มี 1 บรรทัดต่อแพ็กเกจ แต่ละบรรทัดประกอบด้วย
ชื่อแพ็กเกจ และเวอร์ชันที่ขอ (ไม่บังคับ) ดูรายละเอียดเพิ่มเติมได้ที่
requirements.txt
ข้อมูลอ้างอิง
หากต้องการป้องกันไม่ให้บิลด์ได้รับผลกระทบจากการเปลี่ยนแปลงเวอร์ชันของ Dependency ให้พิจารณาตรึงแพ็กเกจ Dependency ไว้กับเวอร์ชันที่เฉพาะเจาะจง
ต่อไปนี้คือตัวอย่างไฟล์ requirements.txt
functions-framework requests==2.20.0 numpy
การแพ็กเกจทรัพยากร Dependency ในเครื่อง
นอกจากนี้ คุณยังแพ็กเกจและติดตั้งใช้งานทรัพยากร Dependency พร้อมกับฟังก์ชันได้ด้วย วิธีนี้มีประโยชน์หากคุณไม่มีทรัพยากร Dependency ผ่านเครื่องมือจัดการแพ็กเกจ pip หรือหากมีการจำกัดการเข้าถึงอินเทอร์เน็ตของสภาพแวดล้อม Cloud Functions
เช่น คุณอาจใช้โครงสร้างไดเรกทอรี ดังต่อไปนี้
myfunction/
├── main.py
└── localpackage/
├── __init__.py
└── script.py
จากนั้นคุณจะนำเข้าโค้ดได้ตามปกติจาก localpackage โดยใช้คำสั่ง
import ต่อไปนี้
# Code in main.py from localpackage import script
โปรดทราบว่าวิธีนี้จะไม่เรียกใช้ไฟล์ setup.py คุณยังคงรวมแพ็กเกจที่มีไฟล์เหล่านั้นได้ แต่แพ็กเกจอาจทำงานไม่ถูกต้องใน Cloud Functions