Dart 自动化流程引擎的实现
具体的实现我还没有想好,但是整体有一个大概的核心思路。这个自动化流程引擎其实就是想做Dart版本的Fastlane。
上图是自动化流程引擎大致的技术架构图,下面我来仔细的进行说明一下。
流程节点
代表流程中的不同的节点,分别是有执行程序构成。也就是Fastlane所谓的Action,后续我也会偏向于这方便的设计。
这个流程节点我主要考虑不但支持Dart程序还可以支持其他的程序,只要能按照约定将数据存放在本地的Local Data里面。
上图的流程节点都是没有逻辑分叉,这个在我的规划里面是支持逻辑分叉的,开始的初期可以先不用考虑。
流程节点的实现在Dart层次主要是通过命令行的方式,这样自由度高,也是之前已经实现过一部分,具有一定的参考性。
dart
Future<void> main(List<String> args) async {
final identifier = args.first;
final resouce = ChannelResouce.fromIdentifier(identifier);
final request = await resouce.loadRequest();
final response = await run(request);
await resouce.saveResponse(response);
}
Future<ChannelResponse> run(ChannelRequest request) async {
// 实现的逻辑
return ChannelResponse.success(data);// 返回对应的数据
}
上面是一个大致的代码,不是真正实现的部分。我们只提供一个标准的run
函数给开发插件的开发者。上面调用和保存结果到本地系统实现。
我们通过标准文件的读取和写入来实现不同程序之间的数据交互,这样就十分的可以扩展。如果你不想用Dart实现,比如你想用Shell,或者用Fastlane或者其他语言。只要你运行能将标准的输入和输出就可以。
这样实现插件的逻辑自由度很高,也可以将目前已有的功能进行迁移。
数据共享
整体是一个流程,这中间一定有数据共享的部分。关于数据共享我主要分位了三个层次。
- 环境变量,这个来源于当前运行期间系统自由的,或者比如Shell脚本进行设置。
- Map 这个主要是在Dart运行期间,可能需要一些环境值,不能直接操作,就通过Map进行存储。
- 本地文件 因为每一个插件都有输入和输出文件生成,那么后续的插件可以根据ID或者什么值拿到对应插件的输入和输出里面的值进行调用。
运行脚本
我打算将整个流程保存下面为一个可读的JSON,比如下面。
json
{
"name": "流程1",
"request": {
"path": "$ENV[PATH]",
"id": "$DATA[流程1][ID]"
},
"response": {
"code": xxxxx-xxxxx
}
}
这样引擎解析之后将所需要请求的值从对应的里面获取,之后给对应插件运行。
这篇文章就先写到这里,后续根据具体的开发再细微的进行调整。