Hello world 示例

此示例通过响应“Hello, World!”来处理 HTTP GET 请求。

// lib/functions.dart
import 'package:functions_framework/functions_framework.dart';
import 'package:shelf/shelf.dart';

@CloudFunction()
Response function(Request request) => Response.ok('Hello, World!');

在您自己的机器上模拟托管环境

您可以使用 Docker 在自己的机器上运行此函数示例,以模拟在托管环境中运行。

$ docker build -t hello .
...

$ docker run -it -p 8080:8080 --name app hello
Listening on :8080

从另一个终端

curl https://:8080
Hello, World!

如果您想知道创建的映像的大小,请输入

$ docker image ls hello
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
hello        latest    3f23c737877b   1 minute ago     11.6MB

编辑函数并在本地测试

如果您想将处理函数(function)重命名为其他名称(例如:handleGet),您需要确保 FUNCTION_TARGET 环境变量已设置为新的函数名称。

例如

@CloudFunction()
Response handleGet(Request request) => Response.ok('Hello, World!');

运行 build_runner 以从 lib/functions.dart 重新生成 bin/server.dart

$ dart run build_runner build
[INFO] Generating build script completed, took 304ms
[INFO] Reading cached asset graph completed, took 46ms
[INFO] Checking for updates since last build completed, took 412ms
[INFO] Running build completed, took 2.2s
[INFO] Caching finalized dependency graph completed, took 28ms
[INFO] Succeeded after 2.3s with 1 outputs (1 actions)

运行测试(请注意,现在必须为测试进程设置 FUNCTION_TARGET

$ FUNCTION_TARGET=handleGet dart test
00:02 +1: All tests passed!

在您的系统上运行它

$ FUNCTION_TARGET=handleGet dart run bin/server.dart
Listening on :8080

如果您想在您的机器上托管测试此功能,请重新构建映像

$ docker build -t hello .
...

如果您之前运行过容器,请确保现在将其移除。假设您已将容器命名为 app(如前所述)

docker rm -f app

现在启动另一个容器,同时确保将环境变量传递给 Docker,以便为容器化函数设置它

$ docker run -it -p 8080:8080 --name app -e 'FUNCTION_TARGET=handleGet' hello
App listening on :8080

清理

完成后,通过输入以下命令进行清理

docker rm -f app        # remove the container
docker image rm hello   # remove the image

Makefile

如果您熟悉 make 并且它在您的路径中,您可以使用提供的 Makefile 在本地开发和测试您的源代码,直到准备好在容器中测试或部署它。支持以下目标

  • make build – 这是默认目标,它将生成 bin/server.dart
  • make clean – 清除 build_runner 缓存并删除 bin/server.dart
  • make test – 运行 cleanbuild 目标,然后运行测试
  • make run – 运行 build 目标,然后在本地启动 Dart 函数服务器

GitHub

查看 Github