填个转表工具 xresloader 去年的坑(数组尾部裁剪)

2023-03-06 11:57:40 浏览数 (1)

前言

xresloader 是一个功能比较全面并且跨平台的Excel导出protobuf、msgpack、xml、lua、json、javascript、UE-Csv、UE-Json等数据格式的工具。 并且整个工具链还包含了基于模板引起生成读表代码的 xres-code-generator ,方便产品/策划使用的 GUI批量执行工具 - xresconv-gui 和方便CI集成和程序使用的 命令行批量执行工具 - xresconv-cli。

在之前很多项目和小伙伴们的使用过程中都提了一些非常不错的一键和建议,还有一个Feature Request。其中有一项对整体的输出流程变动比较大,所以之前只改了部分输出类型的实现。 这两天抽空完成了剩余的部分。

为啥会变动大?

首先,这个需求的功能是,当一个数组在Excel里配置时,如果存在空配置。那么只裁剪末尾的空项,不裁剪前面的。 详情可参见 https://github.com/xresloader/xresloader/issues/6 。 为什么这个需求会导致比较大的变化呢?xresloader 原本支持的模式有两个,一个是裁剪掉所有空项,这样策划配置在Excel里的无效值会被直接过滤掉。 另一个是保留所有的项目,之前我们有个项目是策划用Excel画地图的,这样要保留所有的位置信息。

这两种模式的共同点就是,他们对于一个元素准备转出的时候,都能只根据自己的数据知道自己需不需要被导出。 而在新的这个需求功能中,自己要不要输出就和后面还没跑到的元素有关。

另外由于 xresloader 支持多种输出模式,每种模式的输出方式不完全一样,同时输入模式我们也有Plain模式(把数组配置在一个Excel单元格中)和标准模式(数组的每一个元素单独配置在一个Excel单元格中)。 比如在 UE-Csv 模式中,为了提高性能,我们采用的是流式的输出方式。那么在这种场景下,首先我们需要把上级结构传递到下一级,既我们转出数组内的某个元素的时候要知道目前数组以输出的数据长度和当前元素的下标(标准模式)。这样我们才能知道前面需要补多少数据。 显然如果是一个Plain模式的数组,我们是不需要补元素的,因为本身只能动态长度。但是我们不能根据当前导出是Plain模式还是标准模式来决定是否走补全流程。因为可能出现message数组,数组本身是标准模式,但是message是Plain模式。这样这个单元格转出是Plain模式的,但仍然要补数据。

在去年其实我已经实现了大部分结构的调整和输出模式的裁剪尾部空值的支持。但是那些都是结构化数据,比较好处理。而 UE-Csv 这种流式输出的就比较麻烦,这次主要也就是实现了上面提到的方案的执行细节,总算是填完了这个坑。

额外增加了一个小工具 xresloader-dump-bin

在上个月的时候,为了方便调试,我写了个小工具 xresloader-dump-bin ,用于把 xresloader 输出的协议二进制转换成人类易读的文本。 主要是为了调试方便使用的,因为 xresloader 的结构报了一层,里层是 bytes 没法用protobuf官方工具直接简单得可视化看内容。

这次这个小工具还是用了 Rust 语言写。Rust语言确实是很适合写这类小工具,跨平台和交叉编译都非常方便。运行开销非常小,编译完得包也非常小。

分离协议子模块

另外我还把 xresloader 的协议分离除了单独的仓库( https://github.com/xresloader/xresloader-protocol ),并作为各个依赖仓库的子模块。 这是因为随着跟多的工具的实现,依赖这个协议的越来越多,分离出来可以更好地管理协议,也不需要仅仅为了更新协议拉主仓库。

Upb和Lua读表工具链

最好一个大地改进是读表工具增加了对 upb 和其 Lua binding地支持。 pbc 已经被作者弃坑好多年了,所以我们项目组近期接入了这个更有影响力地方案。 upb 是一个 protobuf 官方的子项目,运行时使用纯C编写。代码生成工具使用C ,依赖 libprotoc 和 abseil-cpp 。并且 upb 是现在protobuf的Ruby, PHP和Python的官方运行时库,里面也包含了Lua binding模块。这样不仅技术支持有保障(有主流项目踩坑),并且能跟进protobuf的新功能。

简单地说,就是读表代码生成工具 xres-code-generator 里增加了支持 upb 和其 Lua binding 的模板和Loader的Service模块。 同时构建系统 cmake-toolset 里增加了对集中不同引入方式和几个典型版本的upb的适配和Patch,并提供了自测小工具。

更多细节可以参见我之前一篇Blog: 《集成 upb 和 lua binding 的踩坑小计》 。

最后

其实还有一些其他的小优化的Feature Request,不过那些变动都不大。下次啥时候能抽出时间来再继续加吧。

欢迎大家试用和提出宝贵意见。

开源主仓库: https://github.com/xresloader/xresloader 文档: https://xresloader.atframe.work/

0 人点赞