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


ฟังก์ชันได้รับอนุญาตให้ใช้โมดูล Node.js ภายนอกและข้อมูลในเครื่อง Dependency ใน Node.js จัดการด้วย npm และแสดงในไฟล์ข้อมูลเมตาชื่อ package.json รันไทม์ Node.js ของ Cloud Functions รองรับการติดตั้งโดยใช้ npm, yarn หรือ pnpm

หากต้องการระบุทรัพยากร Dependency ของฟังก์ชัน ให้เพิ่มลงในไฟล์ package.json

ในตัวอย่างนี้ รายการที่ต้องใช้จะแสดงอยู่ในไฟล์ package.json

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

จากนั้นนําเข้าข้อมูลดังกล่าวในฟังก์ชัน

JavaScriptTypeScript
const escapeHtml = require('escape-html');

// Return a greeting with the input HTML-escaped.
exports.hello = functions.https.onRequest((req, res) => {
  res.send(`Hello ${escapeHtml(req.query.name || req.body.name || 'World')}!`);
});
import * as escapeHtml from 'escape-html';

// Return a greeting with the input HTML-escaped.
export let hello = functions.https.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

ประเภทของข้อกําหนดควรเป็นประเภทเดียวกับข้อกําหนดของไลบรารี เช่น คุณไม่ควรบันทึก uuid เป็นการพึ่งพาตามปกติและ @types/uuid เป็นการพึ่งพาของนักพัฒนาซอฟต์แวร์หรือการพึ่งพาแบบคู่

กำลังโหลดโมดูล 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 v2 ขึ้นไป เพียงระบุที่เก็บ 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 เกี่ยวกับโมดูลส่วนตัว

สร้างฟังก์ชันด้วยทรัพยากรของผู้ให้บริการ

ไลบรารีของผู้ให้บริการคือไลบรารีที่มีแหล่งที่มารวมอยู่ในแพ็กเกจซอร์สโค้ดของคุณโดยตรงและสร้างขึ้นใหม่ควบคู่ไปกับโค้ดของคุณเอง คุณสร้างการอ้างอิง Node.js ของผู้ให้บริการและข้ามการติดตั้งในระหว่างการทำให้ใช้งานได้โดยใช้ตัวแปรสภาพแวดล้อมการสร้าง GOOGLE_VENDOR_NPM_DEPENDENCIES

ข้อกําหนดเบื้องต้นสําหรับทรัพยากร 3rd party

  1. ตรวจสอบว่าคุณมีฟังก์ชันที่ใช้งานได้ซึ่งมีทรัพยากรทั้งหมดที่คุณต้องการให้ผู้ให้บริการกำหนดไว้ในไฟล์ package.json

  2. ติดตั้งการอ้างอิงเหล่านี้ในเครื่องโดยเรียกใช้

        npm install
    
  3. นำ node_modules ออกจากไฟล์ .gcloudignore ในไดเรกทอรีการทำงาน

  4. ติดตั้งใช้งานฟังก์ชัน โดยตรวจสอบว่าเวอร์ชัน Node.js ในพื้นที่ของคุณเหมือนกับเวอร์ชันที่คุณระบุไว้ระหว่างการติดตั้งใช้งาน

  5. ติดตั้งใช้งานฟังก์ชันและทรัพยากร Dependencies ของผู้ให้บริการด้วยคำสั่งต่อไปนี้

      gcloud functions deploy FUNCTION_NAME \
        --runtime RUNTIME_NAME \
        --set-build-env-vars GOOGLE_VENDOR_NPM_DEPENDENCIES=true
    

    แทนที่

    • FUNCTION_NAME: ชื่อของฟังก์ชัน Cloud Functions ที่คุณกำลังทำให้ใช้งานได้
    • RUNTIME_NAME: ชื่อรันไทม์ Node.js เพื่อเรียกใช้ฟังก์ชันที่ติดตั้ง โดยต้องเป็น Node.js เวอร์ชันเดียวกับที่คุณใช้ในสภาพแวดล้อมการพัฒนาในเครื่อง

แพ็กเกจเฟรมเวิร์ก Functions เป็นทรัพยากรที่จำเป็นสำหรับฟังก์ชัน เราขอแนะนำให้ใช้แพ็กเกจนี้กับผู้ให้บริการเพื่อให้บิลด์เร็วขึ้น หากไม่ จะมีการดาวน์โหลดและติดตั้งเมื่อคุณสร้างฟังก์ชัน

หากคุณระบุเครื่องมือ npm ในไฟล์ package.json ระบบจะดาวน์โหลด npm เวอร์ชันที่ระบุ ณ เวลาที่สร้าง หากต้องการระงับลักษณะการทำงานนี้ ให้นำออกจากไฟล์ package.json