Obsługa zależności


Funkcja może używać zewnętrznych modułów Node.js, a także lokalnych danych. Zależnośćami w Node.js zarządza się za pomocą npm i wyraża się je w pliku metadanych o nazwie package.json. Środowiska wykonawcze Node.js w Cloud Functions obsługują instalację za pomocą npm, yarn lub pnpm.

Aby określić zależność funkcji, dodaj ją do pliku package.json.

W tym przykładzie zależność jest wymieniona w pliku package.json:

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

Następnie zależność jest importowana w funkcji:

JavaScript

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

TypeScript

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

Włączanie lokalnych modułów Node.js

W ramach funkcji możesz też uwzględniać lokalne moduły Node.js. Aby to zrobić, zadeklaruj moduł w pliku package.json, używając prefiksu file:. W tym przykładzie mymodule to nazwa modułu, a mymoduledir to katalog zawierający moduł:

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

Kod tego modułu lokalnego powinien być przechowywany w innym folderze niż node_modules w katalogu głównym funkcji.

Dodatkowe kroki w przypadku TypeScript

TypeScript jest najbardziej przydatny, gdy używasz bibliotek zawierających informacje o typach. Dzięki temu TypeScript może wykrywać błędy składni, a edytory mogą wyświetlać lepsze sugestie autouzupełniania. Niektóre biblioteki, np. firebase-adminfirebase-functions, zawierają definicje TypeScript.

Wiele bibliotek nie udostępnia własnej definicji TypeScript. Projekt DefinitelyTyped udostępnia definicje tworzone przez społeczność dla najpopularniejszych bibliotek node. Definicje te są publikowane przez DefinitelyTyped pod tą samą nazwą pakietu NPM, ale w ramach organizacji „@types”. Możesz na przykład zainstalować informacje o typie dla biblioteki uuid, korzystając z tych opcji:

npm install @types/uuid

Gdy zapoznasz się z TypeScript, możesz połączyć obie instalacje:

npm install uuid @types/uuid

Zależności typu powinny być tego samego rodzaju co zależność biblioteki. Na przykład nie należy zapisywać uuid jako zwykłej zależności, a @types/uuid jako zależności od wersji deweloperskiej lub zależności od wersji równorzędnej.

Wczytywanie modułów Node.js

Użyj funkcji Node.js require() , aby załadować dowolny zainstalowany moduł Node.js. Możesz też użyć funkcji require(), aby zaimportować pliki lokalne, które wdrażasz razem z funkcją.

Jeśli funkcje są pisane w języku TypeScript, użyj instrukcji import w taki sam sposób, aby załadować dowolny zainstalowany moduł Node.js.

Korzystanie z modułów prywatnych

Możesz użyć prywatnego modułu npm, podając ustawienia uwierzytelniania w rejestrze w pliku .npmrc w katalogu funkcji. Jeśli jako menedżera pakietów używasz Yarn w wersji 2 lub nowszej, ten plik ma nazwę .yarnrc.yml.

Prywatne moduły z Artifact Registry

Repozytorium pakietów Node.js w rejestrze artefaktów może hostować prywatne moduły Twojej funkcji. Gdy wdrażasz funkcję Google Cloud Functions, proces kompilacji automatycznie generuje dane uwierzytelniające rejestru artefaktów dla konta usługi Cloud Build. Wystarczy, że dodasz repozytorium Artifact Registry do pliku .npmrc bez generowania dodatkowych danych logowania. Przykład:

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

To podejście działa też w przypadku menedżera pakietów Yarn w wersji 1. Jeśli używasz Yarn w wersji 2 lub nowszej, wystarczy, że umieścisz w pliku .yarnrc.yml repozytorium Artifact Registry bez dodatkowych danych logowania. Przykład:

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

moduły prywatne z innych repozytoriów,

W dokumentacji npm znajdziesz informacje o tym, jak tworzyć niestandardowe tokeny dostępu tylko do odczytu. Nie zalecamy używania pliku .npmrc utworzonego w katalogu domowym, ponieważ zawiera on token odczytu i zapisu. Uprawnienia do zapisu nie są wymagane podczas wdrażania i mogą stanowić zagrożenie dla bezpieczeństwa.

Jeśli nie używasz repozytoriów prywatnych, nie dołączaj pliku .npmrc, ponieważ może to wydłużyć czas wdrażania funkcji.

Format pliku

Jeśli do ustawienia niestandardowego tokena autoryzacji używasz pliku .npmrc, powinien on zawierać wiersz pokazany poniżej.

//REGISTRY_DOMAIN/:_authToken=AUTH_TOKEN

Zastąp:

  • REGISTRY_DOMAIN: nazwa domeny prywatnego rejestru npm. Jeśli repozytorium jest hostowane w npmjs.org, ustaw to pole na registry.npmjs.org.
  • AUTH_TOKEN: token autoryzacji dla rejestru npm. Może to być dosłowna wartość tekstowa tokena lub ciąg tekstowy ${NPM_TOKEN}, który npm zastępuje rzeczywistą wartością tokena z otoczenia.

    Zmienną środowiskową $NPM_TOKEN możesz ustawić za pomocą argumentu --set-build-env-vars w poleceniu gcloud functions deploy. Więcej informacji o tokenie autoryzacji NPM znajdziesz w samouczku NPM dotyczącym modułów prywatnych.

Tworzenie funkcji z zależnymi bibliotekami dostawcy

Zależności dostawcy to te, których źródło jest zawarte bezpośrednio w pakiecie kodu źródłowego i jest odtwarzane wraz z Twoim kodem. Tworzysz zależności dostawcy Node.js i pomijasz ich instalowanie podczas wdrażania, używając zmiennej środowiskowej GOOGLE_VENDOR_NPM_DEPENDENCIES.

Wymagania wstępne dotyczące zależności od dostawcy

  1. Upewnij się, że masz działającą funkcję ze wszystkimi zależnościami, które chcesz zdefiniować w pliku package.json.

  2. Zainstaluj te zależności lokalnie, uruchamiając

        npm install
    
  3. Usuń node_modules z pliku .gcloudignore w katalogu roboczym.

  4. Wdróż funkcję, upewniając się, że lokalna wersja Node.js jest taka sama jak ta, którą określisz podczas wdrażania.

  5. Wdróż funkcję i zależne biblioteki za pomocą tego polecenia:

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

    Zastąp:

    • FUNCTION_NAME: nazwa funkcji Cloud Functions, którą wdrażasz
    • RUNTIME_NAME: nazwa środowiska wykonawczego Node.js, w którym ma być wykonywana wdrożona funkcja. Musi to być ta sama wersja Node.js, której używasz w lokalnym środowisku programistycznym.

Pakiet Functions framework jest wymaganą zależnością dla funkcji. Aby przyspieszyć kompilację, zalecamy użycie tego pakietu. Jeśli tego nie zrobisz, zostanie ona pobrana i zainstalowana podczas kompilacji funkcji.

Jeśli w pliku package.json określisz silnik npm, podczas kompilacji zostanie pobrana określona wersja npm. Aby zablokować to zachowanie, usuń ten element z pliku package.json.