编写 Cloud Functions 函数

Cloud Functions 支持以多种编程语言编写源代码。您选择的语言运行时和您要编写的函数类型决定了如何设计代码结构并实现函数。本页面简要介绍了 Cloud Functions 函数的类型以及对源代码的预期。

Cloud Functions 函数的类型

Cloud Functions 函数有两种类型:

如果您需要函数具有网址端点并响应 HTTP 请求(例如针对 webhook),可使用 HTTP 函数。如果函数应直接触发以响应 Google Cloud 项目中的事件(例如 Pub/Sub 主题中收到消息或 Cloud Storage 存储桶发生更改),可使用事件驱动型函数。

源目录结构

为了让 Cloud Functions 能够找到函数定义,每个语言运行时都对构建源代码有一定的要求。每个运行时中函数的基本目录结构如下所示。

Node.js

Node.js 函数的基本目录结构如下:

.
├── index.js
└── package.json

默认情况下,Cloud Functions 会尝试从函数目录的根目录中名为 index.js 的文件加载源代码。如需指定其他主源文件,请在 package.json 文件中使用 main 字段。

package.json 文件还必须包含 Node.js 版 Functions 框架作为依赖项:

{
  "main": "index.js",
  "dependencies": {
    "@google-cloud/functions-framework": "^3.0.0"
  }
}

主文件中的代码必须定义函数入口点,并且可以照常导入其他代码和 Node.js 模块。主文件还可以定义多个函数入口点,可单独进行部署。

Python

Python 函数的基本目录结构如下:

.
├── main.py
└── requirements.txt

Cloud Functions 会从函数目录的根目录中名为 main.py 的文件加载源代码。主文件必须命名为 main.py

requirements.txt 文件必须包含 Python 版 Functions 框架作为依赖项:

functions-framework==3.*

main.py 文件中的代码必须定义函数入口点,并且可以照常导入其他代码和外部依赖项。main.py 文件还可以定义多个函数入口点,可单独进行部署。

Go

Go 函数的基本目录结构如下:

.
├── myfunction.go
└── go.mod

您的函数必须位于项目根目录下的 Go 软件包中,软件包及其源文件可以采用任何名称,但函数不能位于 package main 中。如果您需要 main 软件包(例如用于本地测试),则可以在子目录中创建一个软件包:

.
├── myfunction.go
├── go.mod
└── cmd/
    └── main.go

go.mod 文件必须包含 Go 版 Functions 框架作为依赖项:

module example.com/my-module

require (
  github.com/GoogleCloudPlatform/functions-framework-go v1.5.2
)

根软件包中的代码必须定义函数入口点,并且可以照常从子软件包和依赖项导入其他代码。软件包还可以定义多个函数入口点,可单独进行部署。

Java

Java 函数的基本目录结构如下:

.
├── pom.xml
└── src/
    └── main/
        └── java/
            └── MyFunction.java

Java 源文件必须位于 src/main/java/ 目录下,并且可以采用任何名称。如果源文件声明了软件包,请在 src/main/java 下添加一个额外的目录,其中包含软件包的名称:

.
├── pom.xml
└── src/
    └── main/
        └── java/
            └── mypackage/
                └── MyFunction.java

我们建议将关联测试放在 src/test/java/ 子目录下。

pom.xml 文件必须包含 Java 版 Functions 框架作为依赖项:

...
    <dependency>
      <groupId>com.google.cloud.functions</groupId>
      <artifactId>functions-framework-api</artifactId>
      <version>1.0.4</version>
    </dependency>
...

源文件中的代码必须定义函数入口点,并且可以照常导入其他代码和外部依赖项。源文件还可以定义多个函数入口点,可单独进行部署。

C#

.NET 函数的基本目录结构如下:

.
├── MyFunction.cs
└── MyProject.csproj

您可以像设计任何其他 .NET 源代码结构一样设计您的项目的结构。源文件可以采用任何名称。

您的项目文件必须包含 .NET 版 Functions 框架作为依赖项:

...
    <PackageReference Include="Google.Cloud.Functions.Hosting" Version="1.0.0" />
...

源文件中的代码必须定义函数入口点,并且可以照常导入其他代码和外部依赖项。源文件还可以定义多个函数入口点,可单独进行部署。

您还可以使用 .NET 版 Cloud Functions 函数模板软件包来生成所需的文件。

Ruby

Ruby 函数的基本目录结构如下:

.
├── app.rb
├── Gemfile
└── Gemfile.lock

Cloud Functions 会从函数目录的根目录中名为 app.rb 的文件加载源代码。主文件必须命名为 app.rb

Gemfile 文件必须包含 Ruby 版 Functions 框架作为依赖项:

source "https://rubygems.org"
gem "functions_framework", "~> 1.0"

app.rb 文件中的代码必须定义函数入口点,并且可以照常导入其他代码和外部依赖项。app.rb 文件还可以定义多个函数入口点,可单独进行部署。

PHP

PHP 函数的基本目录结构如下:

.
├── index.php
└── composer.json

Cloud Functions 会从函数目录的根目录中名为 index.php 的文件加载源代码。主文件必须命名为 index.php

composer.json 文件必须包含 PHP 版 Functions 框架作为依赖项:

{
  "require": {
    "google/cloud-functions-framework": "^1.1"
  }
}

index.php 文件中的代码必须定义函数入口点,并且可以照常导入其他代码和外部依赖项。index.php 文件还可以定义多个函数入口点,可单独进行部署。

如果您打算将多个函数分组到单个项目中,请注意每个函数最终可能共享同一组依赖项。 但是,某些函数可能并不需要所有依赖项。

我们建议您尽可能拆分大型多函数代码库,并将每个函数放入各自的顶层目录中(如上所示),其中包含各自的源文件和项目配置文件。此方法可最大限度地减少特定函数所需的依赖项数量,进而减少函数所需的内存量。

函数入口点

源代码必须为函数定义入口点,这是调用 Cloud Functions 函数时执行的特定代码。您可以在部署函数时指定此入口点。

如何定义入口点取决于您使用的语言运行时。对于某些语言,入口点是函数,而对于另一些语言,入口点是类。如需详细了解如何以不同语言定义入口点和实现 Cloud Functions 函数,请参阅编写 HTTP 函数编写事件驱动型函数

依赖项

您可以使用标准工具为每个运行时管理依赖项。如需了解详情,请参阅相应页面:

后续步骤