| Wybierz język: | Node.js Python |
Funkcja Cloud Functions może korzystać z modułów zewnętrznych i zależności lokalnych. Sposób określania zależności i zarządzania nimi zależy od języka środowiska wykonawczego.
Node.js
Funkcja może korzystać z zewnętrznych modułów Node.js oraz lokalnych danych. Zależności w Node.js są zarządzane za pomocą npm i wyrażane 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 w pliku package.json wymieniono zależność:
{ "dependencies": { "escape-html": "^1.0.3" } }
Zależność jest następnie importowana do funkcji:
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")}!`);
});
Uwzględnianie lokalnych modułów Node.js
Możesz też uwzględnić lokalne moduły Node.js jako część funkcji. Możesz to zrobić, deklarując moduł w package.json za pomocą file: prefiksu. 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 miejscu niż folder node_modules w katalogu głównym funkcji.
Dodatkowe czynności 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ładniowe, a edytory mogą wyświetlać lepsze sugestie autouzupełniania. Niektóre biblioteki, np. firebase-admin i firebase-functions, zawierają definicje TypeScript.
Wiele bibliotek nie udostępnia własnej definicji TypeScript. Projekt DefinitelyTyped udostępnia definicje najpopularniejszych bibliotek węzłów, które są utrzymywane przez społeczność.
DefinitelyTyped publikuje te definicje pod tą samą nazwą pakietu NPM, ale w organizacji „@types”. Możesz na przykład zainstalować informacje o typie dla biblioteki uuid za pomocą tego polecenia:
npm install @types/uuid
Gdy lepiej poznasz 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. Nie należy na przykład zapisywać uuid jako zwykłej zależności, a @types/uuid jako zależności deweloperskiej lub zależności równorzędnej.
Wczytywanie modułów Node.js
Użyj funkcji Node.js
require()
, aby wczytać dowolny zainstalowany moduł Node.js. Możesz też użyć funkcji
require(), aby zaimportować lokalne pliki wdrażane razem z funkcją.
Jeśli piszesz funkcje w TypeScript, użyj instrukcji
import
w ten 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 używasz Yarn w wersji 2 lub nowszej jako menedżera pakietów, ten plik ma nazwę .yarnrc.yml.
Prywatne moduły z Artifact Registry
Repozytorium pakietów Node.js w Artifact Registry
może hostować prywatne moduły funkcji. Gdy wdrażasz funkcję Google Cloud Functions, proces kompilacji automatycznie generuje dane logowania Artifact Registry dla konta usługi Cloud Build.
W .npmrc wystarczy podać repozytorium Artifact Registry 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 v1.
Jeśli używasz Yarn w wersji 2 lub nowszej, wystarczy, że wymienisz repozytorium Artifact Registry w .yarnrc.yml 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 prywatnych repozytoriów, nie uwzględniaj pliku .npmrc, ponieważ może to wydłużyć czas wdrażania funkcji.
Format pliku
Jeśli do ustawienia niestandardowego tokena uwierzytelniania 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 w tym polu wartość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}, w którymnpmjest zastępowany rzeczywistą wartością tokena z danego środowiska.Zmienną środowiskową
$NPM_TOKENmożesz ustawić za pomocą argumentu--set-build-env-varsw poleceniugcloud functions deploy. Więcej informacji o tokenie uwierzytelniania NPM znajdziesz w samouczku NPM dotyczącym modułów prywatnych.
Python
Zależności dla funkcji Cloud Functions napisanych w Pythonie można określić na 2 sposoby: za pomocą pliku requirements.txt menedżera pakietów pip lub przez spakowanie lokalnych zależności wraz z funkcją.
Specyfikacja zależności za pomocą standardu Pipfile/Pipfile.lock nie jest obsługiwana. Projekt nie powinien zawierać tych plików.
Określanie zależności za pomocą narzędzia pip
Zależności w Pythonie są zarządzane za pomocą narzędzia pip i wyrażane w pliku metadanych o nazwie requirements.txt.
Ten plik musi znajdować się w tym samym katalogu co plik main.py zawierający kod funkcji.
Gdy wdrażasz lub ponownie wdrażasz funkcję, Cloud Functions używa narzędzia pip do pobierania i instalowania najnowszej wersji zależności zadeklarowanych w pliku requirements.txt.
Plik requirements.txt zawiera po jednym wierszu na pakiet. Każdy wiersz zawiera nazwę pakietu i opcjonalnie żądaną wersję. Więcej informacji znajdziesz w requirements.txt
dokumentacji.
Aby zapobiec wpływowi zmian wersji zależności na kompilację, rozważ przypięcie pakietów zależności do konkretnej wersji.
Oto przykład pliku requirements.txt:
functions-framework requests==2.20.0 numpy
Pakowanie zależności lokalnych
Możesz też spakować i wdrożyć zależności razem z funkcją. To podejście jest przydatne, jeśli zależności nie są dostępne w menedżerze pakietów pip lub jeśli dostęp do internetu w środowisku Cloud Functions jest ograniczony.
Możesz na przykład użyć takiej struktury katalogów:
myfunction/
├── main.py
└── localpackage/
├── __init__.py
└── script.py
Następnie możesz zaimportować kod w zwykły sposób z localpackage za pomocą tego polecenia:import
# Code in main.py from localpackage import script
Pamiętaj, że ta metoda nie uruchomi żadnych plików setup.py. Pakiety z tymi plikami nadal można łączyć, ale mogą one nie działać prawidłowo na urządzeniu Cloud Functions.