การจัดการทรัพยากร Dependency

เลือกภาษา: 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