Project 规范
两个最低要求:
- packages 目录
- project.yml
packages 目录规范
packages 的目录规范与你的 Function 的目录规范是一致的,例如我创建了这么一个 Function:
图 1:An Digital Ocean Function Creation |
---|
那么对应的 package 目录就为:
[root@liqiang.io]# tree
.
├── packages
│ └── test-package
│ └── functiona
│ └── main.go
└── project.yml
packages 目录允许包含多个 Functions 的,按照这个标准来就可以了。
project.yml 规范
这里直接先放一个又所有属性的 project 配置文件:
parameters:
param1: value
environment:
env1: value
packages:
- name: package1
parameters: {}
environment: {}
annotations: {}
actions:
- name: function1
parameters: {}
environment: {}
limits: {}
runtime: 'go:default'
main: ''
可以看到整体是三层结构:
- 第一层:project 级别,一个 project 包含多个 package。在 project 层级定义的属性都将被 package 继承;
- 第二层:package 级别,一个 package 包含多个 function。在 package 级别定义的属性也将被 function 继承(当然包括从 project 继承的属性);
- 第三层:function 级别,定义属于这个 function 的特殊属性。
通用函数
可以看到,三层都有参数 parameters 和 environment。
parameters
定义在 parameters 的属性都会作为参数传递给 Function,例如 Function 的入口接口如下:
func Main(args map[string]interface{}) map[string]interface{} {
那么这些定义的参数都是 args 的一部分。
environment
这个就是老生常谈的环境变量的,就不多做介绍了。
Function 参数
main
main
这个参数定义了 Function 的入口,你可能会奇怪,不是说入口是 Main
的么,为什么又需要自定义?其实也很简单,Main
是默认入口,如果你不定义,那么就用它,如果你需要自定义,就可以通过 main
参数来定义。
runtime
runtime
是用来定义应用运行时的,例如我用的是 go,那么就定义 go 作为 runtime,但是 go 也有不同版本啊,所以你可以指定 go 的版本,默认就使用 go:default
,指定版本就类似于:go:1.18
。
limits
limits
字段是用于限制 Function 的一些属性,当前支持以下属性:
timeout
:单位:ms,用于限制 API 的响应时间;memory
:单位:MB,用于限制程序的使用内存;logs
:单位:KB,用于限制程序的日志大小;
一些经验
- Function 代码只能在单个目录下
- 我猜测:Function 定位为
function
,而不是一个project
,所以规模不应该很大,单层目录可以满足要求 - 我猜测:Function 是一个业务单元,当需要分层构造更复杂的结构时,需要组合不同的 Function 来完成
- 我猜测:Function 定位为
- 感觉就是 Digital Ocean 的这个 Function 功能实在还是比较年轻,首先公开的功能还是很局限的,但是我知道他支持的肯定不是只有这么多,但是事实上也只有这么多能知道怎么用。
- 例如这个示例项目:https://github.com/digitalocean/sample-functions-golang-random 中的 app-spec.yaml 是怎么用的就没有说明;
- 还有例如 Go 项目如果 import 其他 package 应该如何操作这个也是没有说明的;