Abhängigkeiten in Python angeben

Es gibt zwei Möglichkeiten, Abhängigkeiten für Cloud Functions-Funktionen festzulegen, die in Python geschrieben wurden: entweder mithilfe der Datei requirements.txt des Paketmanagers „pip“ oder durch Erstellen eines Pakets, das neben der Funktion auch lokale Abhängigkeiten enthält.

Die Abhängigkeitsspezifikation mit dem Standard Pipfile/Pipfile.lock wird nicht unterstützt. Das Projekt sollte diese Dateien nicht enthalten.

Abhängigkeiten mit pip angeben

Abhängigkeiten in Python werden mit pip verwaltet und in einer Metadatendatei mit dem Namenrequirements.txt ausgedrückt. Diese Datei muss sich im selben Verzeichnis wie die Datei main.py befinden, die den Funktionscode enthält.

Wenn Sie die Funktion bereitstellen oder neu bereitstellen, lädt Cloud Functions die neueste Version der Abhängigkeiten wie in der Datei requirements.txt angegeben herunter und installiert diese. Die Datei requirements.txt enthält eine Zeile pro Paket. Jede Zeile enthält den Paketnamen und optional die angeforderte Version. Weitere Informationen finden Sie in der Referenz zu requirements.txt.

Sie können Ihre Abhängigkeitspakete an eine bestimmte Version anpinnen, um zu verhindern, dass der Build von Änderungen an Abhängigkeitsversionen betroffen ist.

Hier sehen Sie eine requirements.txt-Beispieldatei:

functions-framework
requests==2.20.0
numpy

Das Functions Framework ist eine erforderliche Abhängigkeit für alle Funktionen. Obwohl Cloud Functions sie bei der Erstellung der Funktion für Sie installiert, empfehlen wir, sie zur Klarstellung hinzuzufügen.

Wenn Ihre Funktion private Abhängigkeiten benötigt, sollten Sie functions-framework in Ihre private Registry spiegeln. Fügen Sie die gespiegelte functions-framework als Abhängigkeit zu Ihrer Funktion hinzu, um die Installation des Pakets aus dem öffentlichen Internet zu vermeiden.

Paket mit lokalen Abhängigkeiten erstellen

Sie können auch ein Paket mit der Funktion und ihren Abhängigkeiten erstellen und bereitstellen. Dies ist nützlich, wenn Ihre Abhängigkeit nicht über den pip-Paketmanager verfügbar ist oder der Internetzugriff Ihrer Cloud Functions-Umgebung eingeschränkt ist.

Beispielsweise können Sie eine Verzeichnisstruktur verwenden, die so aussieht:

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

Anschließend können Sie den Code mit der folgenden import-Anweisung wie gewohnt aus localpackage importieren.

# Code in main.py
from localpackage import script

Beachten Sie, dass bei diesem Ansatz keine setup.py-Dateien ausgeführt werden. Pakete mit diesen Dateien können weiterhin gebündelt werden, aber in Cloud Functions unter Umständen nicht ordnungsgemäß ausgeführt werden.

Anbieterabhängigkeiten

Anbieterbasierte Abhängigkeiten sind Abhängigkeiten, deren Quelle direkt in Ihrem Quellcodepaket enthalten und zusammen mit Ihrem eigenen Code neu erstellt wird. Verwenden Sie die Umgebungsvariable GOOGLE_VENDOR_PIP_DEPENDENCIES, um Abhängigkeiten von Vendor-Anbietern zu erstellen und diese während der Bereitstellung zu vermeiden.

Anbieteranbieter-Abhängigkeiten erstellen

  1. Prüfen Sie, ob python3 auf Ihrem Entwicklungssystem installiert ist.

  2. Deklarieren Sie die Anwendungsabhängigkeiten in einer requirements.txt-Datei im Stammverzeichnis Ihrer Entwicklungsstruktur.

  3. Deklarieren Sie Functions Framework als Anforderung, indem Sie functions-framework in eine separate Zeile in Ihre requirements.txt-Datei aufnehmen.

  4. Laden Sie die Abhängigkeiten Ihrer Funktion in das lokale Verzeichnis herunter. Die dafür erforderlichen Schritte hängen davon ab, ob die Abhängigkeit eine Python-Rad-Datei (*.whl) oder eine TAR-Datei (*.tar.gz) ist.

    1. Wenn die Abhängigkeit ein Python-Rad (*.whl) ist, laden Sie sie mit diesem pip-Befehl in das Stammverzeichnis Ihres Entwicklungsbaums herunter:

      python3 -m pip download -r requirements.txt --only-binary=:all: \
         -d DIRECTORY \
         --python-version PYTHON_RUNTIME_NAME \
         --platform manylinux2014_x86_64 \
         --implementation cp
      

      Ersetzen Sie:

      • DIRECTORY: der Name des lokalen Verzeichnisses, in das heruntergeladen werden soll.
      • PYTHON_RUNTIME_NAME: Die Python-Version, die für Kompatibilitätsprüfungen verwendet werden soll

      Die resultierende Verzeichnisstruktur sollte so aussehen:

      myfunction/
      ├── main.py
      └── requirements.txt
      └── DIRECTORY
         ├── dependency1.whl
         └── dependency2.whl
      
    2. Wenn die Abhängigkeit eine TAR-Datei (*.tar.gz) ist:

      1. Wenn die Abhängigkeit in Python geschrieben ist, laden Sie sie von pip herunter:

        python3 -m pip download -r requirements.txt \
           -d DIRECTORY
        
      2. Wenn eine Abhängigkeit aus Code besteht, der in C oder C++ geschrieben ist, müssen Sie diese separat herunterladen und kompilieren.

  5. Stellen Sie die Funktion und die zugehörigen Abhängigkeiten bereit:

    gcloud functions deploy FUNCTION_NAME \
      --runtime PYTHON_RUNTIME_NAME \
      --set-build-env-vars GOOGLE_VENDOR_PIP_DEPENDENCIES=DIRECTORY
    

    Ersetzen Sie:

    • FUNCTION_NAME: der Name der Cloud Functions-Funktion, die Sie bereitstellen
    • PYTHON_RUNTIME_NAME: der Name der Python-Laufzeit, unter der die bereitgestellte Funktion ausgeführt wird, z. B. python311. Dies muss dieselbe Python-Laufzeitversion sein, die Sie in Ihrer lokalen Entwicklungsumgebung verwendet haben.
    • DIRECTORY:der Name des Verzeichnisses, das Ihre Anbieterabhängigkeiten enthält

Weitere Informationen zur Verwendung von Buildpacks finden Sie unter Funktion mit Buildpacks erstellen.

Private Abhängigkeiten verwenden

Private Abhängigkeiten von Artifact Registry

Ein Artifact Registry-Python-Repository kann private Abhängigkeiten für Ihre Python-Funktion hosten. Bei der Bereitstellung in Cloud Functions generiert der Build-Prozess automatisch Artifact Registry-Anmeldedaten für das Cloud Build-Dienstkonto. Sie müssen nur die Artifact Registry-URL in requirements.txt aufnehmen, ohne zusätzliche Anmeldedaten zu generieren. Beispiel:

--index-url REPOSITORY_URL
sampleapp
Flask==0.10.1
google-cloud-storage

Wenn Ihr Build mehrere Repositories benötigt, verwenden Sie ein virtuelles Artifact Registry-Repository, um die Reihenfolge, in der pip Ihre Repositories durchsucht, sicher zu steuern.

Private Abhängigkeiten aus anderen Repositories

Abhängigkeiten werden in einer Umgebung von Cloud Build installiert, die keinen Zugriff auf SSH-Schlüssel bietet. Pakete, die auf Repositories gehostet werden, für die eine SSH-basierte Authentifizierung erforderlich ist, müssen wie im vorangehenden Abschnitt beschrieben zusammen mit dem Code Ihres Projekts übernommen und hochgeladen werden.

Sie können den Befehl pip install mit dem Flag -t DIRECTORY verwenden, um private Abhängigkeiten vor der Bereitstellung Ihrer Anwendung in ein lokales Verzeichnis zu kopieren:

  1. Kopieren Sie Ihre Abhängigkeit in ein lokales Verzeichnis:

    pip install -t DIRECTORY DEPENDENCY
  2. Fügen Sie dem Verzeichnis DIRECTORY eine leere Datei __init__.py hinzu, um es in ein Modul zu verwandeln.

  3. Führen Sie einen Import aus diesem Modul durch, um Ihre Abhängigkeit zu verwenden:

    import DIRECTORY.DEPENDENCY

Vorinstallierte Pakete

Die folgenden Python-Pakete werden im Zuge der Bereitstellung automatisch zusammen mit Ihrer Funktion installiert. Wenn Sie eines dieser Pakete im Funktionscode verwenden, sollten Sie die folgenden Versionen in Ihre requirements.txt-Datei aufnehmen:

Python 3.7

aiohttp==3.8.1
aiosignal==1.2.0
async-timeout==4.0.2
attrs==21.4.0
cachetools==4.2.4
certifi==2021.10.8
chardet==4.0.0
charset-normalizer==2.0.10
click==8.0.3
Flask==2.0.2
frozenlist==1.2.0
google-api-core==2.3.2
google-api-python-client==2.34.0
google-auth==2.3.3
google-auth-httplib2==0.1.0
google-cloud-core==2.2.1
google-cloud-trace==1.5.1
googleapis-common-protos==1.54.0
grpcio==1.43.0
grpcio-status==1.43.0
httplib2==0.20.2
idna==3.3
itsdangerous==2.0.1
Jinja2==3.0.3
MarkupSafe==2.0.1
multidict==5.2.0
opencensus==0.8.0
opencensus-context==0.1.2
packaging==21.3
proto-plus==1.19.8
protobuf==3.19.1
pyasn1==0.4.8
pyasn1-modules==0.2.8
pyparsing==3.0.6
pytz==2021.3
PyYAML==6.0
requests==2.27.1
rsa==4.8
setuptools==60.3.1
six==1.16.0
uritemplate==4.1.1
urllib3==1.26.7
Werkzeug==2.0.2
wrapt==1.13.3
yarl==1.7.2

Python 3.8 und höher

click==8.1.7
cloudevents==1.9.0
deprecation==2.1.0
Flask==2.2.5
functions-framework==3.0.0
gunicorn==20.1.0
importlib-metadata==6.7.0
itsdangerous==2.1.2
Jinja2==3.1.2
MarkupSafe==2.1.3
packaging==23.1
typing_extensions==4.7.1
watchdog==1.0.2
Werkzeug==2.2.3
zipp==3.15.0

* `pip` (latest version)
* `setuptools` (latest version)
* `wheel` (determined by product requirements)

Darüber hinaus enthält die Python-Laufzeit eine Reihe von Systempaketen in der Ausführungsumgebung. Wenn die Funktion eine Abhängigkeit verwendet, für die ein nicht aufgeführtes Paket erforderlich ist, können Sie ein Paket anfordern.