Bağımlılıkları yönetme

Dil seçin: Node.js Python

Cloud Functions işlevi, harici modülleri ve yerel bağımlılıkları kullanabilir. Bağımlıları nasıl belirleyeceğiniz ve yöneteceğiniz, çalışma zamanı dilinize bağlıdır.

Node.js

İşlevlerin, harici Node.js modüllerinin yanı sıra yerel verileri de kullanmasına izin verilir. Node.js'deki bağımlılıklar npm ile yönetilir ve package.json adlı bir meta veri dosyasında ifade edilir. Cloud Functions Node.js çalışma zamanları, npm, yarn veya pnpm kullanılarak yüklemeyi destekler.

İşleviniz için bir bağımlılık belirtmek üzere bağımlılığı package.json dosyanıza ekleyin.

Bu örnekte, package.json dosyasında bir bağımlılık listelenmiştir:

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

Bağımlılık daha sonra işlevde içe aktarılır:

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

Yerel Node.js modüllerini dahil etme

İşlevinize yerel Node.js modüllerini de dahil edebilirsiniz. Bunu, package.json içinde modülünüzü file: önekini kullanarak bildirerek yapabilirsiniz. Aşağıdaki örnekte mymodule, modül adınızı, mymoduledir ise modülünüzü içeren dizini ifade eder:

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

Bu yerel modülün kodu, işlevinizin kök dizinindeki node_modules klasörü dışında bir yerde saklanmalıdır.

TypeScript için ek adımlar

TypeScript, tür bilgisi içeren kitaplıklar kullandığınızda size en çok yardımcı olur. Bu sayede TypeScript, söz dizimi hatalarını yakalayabilir ve düzenleyiciler size daha iyi otomatik tamamlama önerileri sunabilir. firebase-admin ve firebase-functions gibi bazı kitaplıklar, TypeScript tanımlarıyla birlikte gönderilir.

Birçok kitaplık kendi TypeScript tanımını sağlamaz. DefinitelyTyped projesi, en popüler düğüm kitaplıkları için topluluk tarafından sürdürülen tanımlar sağlar. DefinitelyTyped, bu tanımları aynı NPM paket adı altında ancak "@types" kuruluşu içinde yayınlar. Örneğin, uuid kitaplığının tür bilgilerini aşağıdaki komutla yükleyebilirsiniz:

npm install @types/uuid

TypeScript'e alıştıkça her iki yüklemeyi de birleştirebilirsiniz:

npm install uuid @types/uuid

Tür bağımlılıkları, kitaplık bağımlılığıyla aynı türde olmalıdır. Örneğin, uuid öğesini normal bağımlılık, @types/uuid öğesini ise geliştirme bağımlılığı veya eş bağımlılığı olarak kaydetmemelisiniz.

Node.js modüllerini yükleme

Yüklediğiniz Node.js modüllerini yüklemek için Node.js require() işlevini kullanın. İşlevinizle birlikte dağıttığınız yerel dosyaları içe aktarmak için require() işlevini de kullanabilirsiniz.

TypeScript'te işlev yazıyorsanız yüklediğiniz Node.js modüllerini yüklemek için import ifadesini aynı şekilde kullanın.

Özel modülleri kullanma

İşlevin dizinindeki bir .npmrc dosyasında kayıt defteriyle kimlik doğrulama ayarlarını sağlayarak özel bir npm modülü kullanabilirsiniz. Paket yöneticiniz olarak Yarn v2 veya sonraki bir sürümü kullanıyorsanız bu dosyanın adı .yarnrc.yml olur.

Artifact Registry'deki özel modüller

Artifact Registry Node.js paket deposu, işleviniz için özel modüllere ev sahipliği yapabilir. Google Cloud Functions işlevi dağıttığınızda derleme işlemi, Cloud Build hizmet hesabı için otomatik olarak Artifact Registry kimlik bilgileri oluşturur. Ek kimlik bilgileri oluşturmadan yalnızca .npmrc dosyanızda Artifact Registry deposunu listelemeniz gerekir. Örneğin:

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

Bu yaklaşım, Yarn v1 paket yöneticisi için de geçerlidir. Yarn v2 veya daha yeni bir sürüm kullanıyorsanız ek kimlik bilgileri olmadan yalnızca .yarnrc.yml dosyanızda Artifact Registry deposunu listelemeniz gerekir. Örneğin:

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

Diğer depolardaki özel modüller

npm belgelerinde, özel salt okunur erişim jetonlarının nasıl oluşturulacağı açıklanmaktadır. Ana dizinde oluşturulan .npmrc dosyasının okunabilir/yazılabilir jeton içerdiğinden kullanılmasını önermiyoruz. Dağıtım sırasında yazma izinleri gerekli değildir ve güvenlik riski oluşturabilir.

Özel depoları kullanmıyorsanız .npmrc dosyasını eklemeyin. Bu dosya, işlevlerinizin dağıtım süresini uzatabilir.

Dosya biçimi

Özel bir kimlik doğrulama jetonu ayarlamak için .npmrc dosyası kullanıyorsanız bu dosya aşağıdaki satırı içermelidir.

//REGISTRY_DOMAIN/:_authToken=AUTH_TOKEN

Değiştir:

  • REGISTRY_DOMAIN: Özel npm kayıt defterinizin alan adı. Deponuz npmjs.org ile barındırılıyorsa bu alanı registry.npmjs.org olarak ayarlayın.
  • AUTH_TOKEN: npm kayıt defteriniz için yetkilendirme jetonu. Bu, jetonun gerçek metin değeri veya ${NPM_TOKEN} yerine ortamdaki gerçek jeton değerinin kullanıldığı metin dizesi npm olabilir.

    $NPM_TOKEN ortam değişkenini, gcloud functions deploy komutunuzun --set-build-env-vars bağımsız değişkeniyle ayarlayabilirsiniz. NPM kimlik doğrulama jetonu hakkında daha fazla bilgi için NPM'deki özel modüllerle ilgili eğitime bakın.


Python

Python'da yazılmış Cloud Functions için bağımlılıkları belirtmenin iki yolu vardır: pip paket yöneticisinin requirements.txt dosyasını kullanma veya yerel bağımlılıkları işlevinizle birlikte paketleme.

Pipfile/Pipfile.lock standardı kullanılarak yapılan bağımlılık spesifikasyonu desteklenmez. Projenizde bu dosyalar bulunmamalıdır.

Bağımlılıkları pip ile belirtme

Python'daki bağımlılıklar pip ile yönetilir ve requirements.txt adlı bir meta veri dosyasında ifade edilir. Bu dosya, işlev kodunuzu içeren main.py dosyasıyla aynı dizinde olmalıdır.

İşlevinizi dağıttığınızda veya yeniden dağıttığınızda Cloud Functions, requirements.txt dosyasında belirtilen bağımlılıklarınızın en son sürümünü indirmek ve yüklemek için pip'i kullanır. requirements.txt dosyası, paket başına bir satır içerir. Her satırda paket adı ve isteğe bağlı olarak istenen sürüm bulunur. Daha fazla bilgi için requirements.txt referansına bakın.

Derlemenizin bağımlılık sürümü değişikliklerinden etkilenmesini önlemek için bağımlılık paketlerinizi belirli bir sürüme sabitlemeyi düşünebilirsiniz.

Aşağıda bir örnek requirements.txt dosyası verilmiştir:

functions-framework
requests==2.20.0
numpy

Yerel bağımlılıkları paketleme

Ayrıca, bağımlılıkları işlevinizle birlikte paketleyip dağıtabilirsiniz. Bu yaklaşım, bağımlılığınız pip paket yöneticisi aracılığıyla kullanılamıyorsa veya Cloud Functions ortamınızın internet erişimi kısıtlanmışsa kullanışlıdır.

Örneğin, aşağıdaki gibi bir dizin yapısı kullanabilirsiniz:

myfunction/
├── main.py
└── localpackage/
    ├── __init__.py
    └── script.py

Ardından, aşağıdaki import ifadesini kullanarak kodu localpackage'dan her zamanki gibi içe aktarabilirsiniz.

# Code in main.py
from localpackage import script

Bu yaklaşımın setup.py dosyalarını çalıştırmayacağını unutmayın. Bu dosyaları içeren paketler yine de paketlenebilir ancak Cloud Functions üzerinde doğru şekilde çalışmayabilir.