在 Python(第 1 代)中指定依赖项

您可以通过两种方式为使用 Python 编写的 Cloud Run functions 函数指定依赖项:使用 pip 软件包管理系统的 requirements.txt 文件,或将本地依赖项与您的函数封装在一起。

不支持使用 Pipfile/Pipfile.lock 标准的依赖项规范。您的项目不应包含这些文件。

使用 pip 指定依赖项

Python 依赖项可通过 pip 进行管理,并在元数据文件 requirements.txt 中表示。此文件必须与包含函数代码的 main.py 文件位于同一目录中。

部署或重新部署函数时,Cloud Run functions 使用 pip 下载并安装 requirements.txt 文件中声明的依赖项的最新版本。在 requirements.txt 文件中,每个软件包对应一行内容。每行包含软件包名称和(可选)请求的版本。如需了解详情,请参阅 requirements.txt 参考文档

为了防止 build 受到依赖项版本更改的影响,请考虑将依赖项软件包固定到特定版本。

下面是一个 requirements.txt 文件示例:

functions-framework
requests==2.20.0
numpy

Cloud Functions 框架是所有函数都必需的依赖项。虽然 Cloud Run functions 会在创建函数时代表您安装该框架,但为清楚起见,我们建议您将其添加为显式依赖项。

如果函数依赖于专用依赖项,我们建议您将 functions-framework 镜像到您的私有注册表。将镜像的 functions-framework 作为依赖项添加到函数中,以避免从公共互联网安装软件包。

封装本地依赖项

您还可以将依赖项与函数一起进行打包和部署。如果依赖项不能通过 pip 软件包管理系统获取,或者您的 Cloud Run functions 环境的互联网访问受限,则此方法很有用。

例如,您可以使用如下所示的目录结构:

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

然后,您可以照常使用以下 import 语句从 localpackage 导入代码。

# Code in main.py
from localpackage import script

请注意,此方法不会运行任何 setup.py 文件。包含这些文件的软件包仍可以捆绑,但可能无法在 Cloud Run functions 上正常运行。

Vendored 依赖项

Vendored 依赖项是其源代码直接包含在源代码包中并与您自己的代码一起重新构建的依赖项。使用 GOOGLE_VENDOR_PIP_DEPENDENCIES 构建环境变量,创建 vendored pip 依赖项,并避免在部署期间安装这些依赖项。

创建 vendored 依赖项

  1. 确保您的开发系统上安装了 python3

  2. 在开发树根目录下的 requirements.txt 文件中声明您的应用依赖项

  3. 通过在 requirements.txt 文件中的单独行添加 functions-framework,将 Functions 框架声明为要求。

  4. 将函数的依赖项下载到本地目录。执行此操作的步骤取决于依赖项是 Python wheel (*.whl) 文件还是 tar 文件 (*.tar.gz)。

    1. 如果依赖项是 Python wheel (*.whl),请使用以下 pip 命令将其下载到开发树的根目录中:

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

      您需要进行如下替换:

      • DIRECTORY:要下载到其中的本地目录的名称
      • PYTHON_RUNTIME_VERSION:用于兼容性检查的 Python 版本。例如,311 for Python 3.11。
        此版本必须与某个支持的 Python 运行时相匹配

      生成的目录结构应如下所示:

      myfunction/
      ├── main.py
      └── requirements.txt
      └── DIRECTORY
         ├── dependency1.whl
         └── dependency2.whl
      
    2. 如果依赖项是 tar 文件 (*.tar.gz),则:

      1. 如果依赖项是用 Python 编写的,请使用 pip 下载它:

        python3 -m pip download -r requirements.txt \
           -d DIRECTORY
        
      2. 如果依赖项包含使用 C 或 C++ 编写的代码,则必须单独将其下载并进行编译。

  5. 部署您的函数及其 vendored 依赖项:

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

    您需要进行如下替换:

    • FUNCTION_NAME:您要部署的 Cloud Run functions 函数的名称
    • PYTHON_RUNTIME_NAME:一个支持的 Python 运行时的名称,用于运行已部署的函数,例如 python311。其必须与您在本地开发环境中使用的 Python 运行时版本相同。
    • DIRECTORY:包含 vendored 依赖项的目录的名称

如需详细了解如何使用 Buildpack,请参阅使用 Buildpack 构建函数

使用专用依赖项

来自 Artifact Registry 的专用依赖项

Artifact Registry Python 制品库可以为您的 Python 函数托管专用依赖项。部署到 Cloud Run functions 时,构建流程将自动为 Cloud Build 服务账号生成 Artifact Registry 凭据。您只需在 requirements.txt 中添加 Artifact Registry 网址,而不需要生成其他凭据。例如:

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

如果您的构建需要多个代码库,请使用 Artifact Registry 虚拟代码库来安全地控制 pip 搜索代码库的顺序。

来自其他代码库的专用依赖项

依赖项安装在 Cloud Build 环境中,该环境不提供对 SSH 密钥的访问权限。如上一部分所述,如果软件包托管在代码库中,并且需要进行基于 SSH 的身份验证,则必须将其与项目代码一同通过 vendoring 方法添加和上传。

您可以先使用带有 -t DIRECTORY 标志的 pip install 命令将专用依赖项复制到本地目录,然后再部署应用,如下所述:

  1. 将依赖项复制到本地目录:

    pip install -t DIRECTORY DEPENDENCY
  2. 将空 __init__.py 文件添加到 DIRECTORY 目录,以将其转换为模块。

  3. 从此模块中导入依赖项以进行使用:

    import DIRECTORY.DEPENDENCY

预装软件包

在部署期间,以下 Python 软件包会与您的函数一起自动安装。如果您的函数代码中使用其中任何软件包,我们建议您将以下版本添加到 requirements.txt 文件中:

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 及更高版本

click==8.1.7
cloudevents==1.11.0
deprecation==2.1.0
Flask==2.2.5
functions-framework==3.8.1
gunicorn==23.0.0
importlib-metadata==6.7.0
itsdangerous==2.1.2
jinja2==3.1.4
MarkupSafe==2.1.5
packaging==24.0
typing_extensions==4.7.1
watchdog==3.0.0
Werkzeug==2.2.3
zipp==3.15.0

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

此外,Python 运行时在执行环境中添加了多个系统软件包。如果您的函数使用的依赖项需要未列出的系统软件包,您可以请求添加软件包