时隔两年,再次更新 Beex。效果:
我笔记本完全节能模式,400 多篇文章的生成速度从 3 秒多降低到 700 多毫秒这个量级,性能模式只要 300 毫秒。
原来我写自己的程序是每个项目一个 Git 库,这么多年实践下来最大的问题是代码复用全靠 Ctrl + C,Ctrl + V。即便抽取了公共函数库,但项目之间是隔离的,所以要么硬编码路径引用,要么就将公共库复制到项目里去。
这样更新公共函数的心智负担就很重,在某个项目里更新了,还要记得复制到其他项目的公共库文件里,否则时间长了就又变成一堆互相不兼容的假公共函数了。
最后的解决办法还是 MonoRepo,这样各个项目之间就是“软”引用,同时我也决定从 Git 迁移至 SVN,于是开始整理所有老代码。
用 Git 还是用 SVN 我考虑了很久,最终考虑到二进制文件的版本管理决定用 SVN。如我为 APP 做一些资源图片,图片的源文件也可以用 SVN 一起提交,如果是 Git 就需要用 Git-LFS。我没有找到 Git-LFS 如何存储大文件的详细说明,但看了一些文章好像依然是每个版本存储整个文件而非差异。如果二进制文件用 SVN,代码用 Git,等于又把 MonoRepo 给拆开了。
技术上 Pijul 是接近完美的解决方案,可惜太过小众,生态不完善,开发进度缓慢。
总之迁移后心智负担小很多,不用惦记着复制来复制去,有新点子就更新,破坏性检查交给 Rust 编译器,体验很好,所以我把 Beex 的插件系统给更新了。
两年前尝试为 Beex 增加了插件系统,当时的设计是有的过滤器针对文章内容,所以参数形式就是一个 function(text)
,返回字符串;有的过滤器是针对模板上下文,所以参数是 function(context)
,返回值也得是表;还有的过滤器同时处理它俩,那么参数就得是 function(text, context)
,返回值就得是 string, table
。可能以后还需要其他形式,每一种都要实现 Rust 和 Lua 之间的转换,有点麻烦。不过已经为自己写好了几个插件,实现了常用的几种文章模板也可以自动生成,把自己从恼人的“简单重复”的劳动中解放了出来,程序跑得很好,就一直没有改。
新的过滤器形式是全部为 function(args)
,args
是一个表,不同的过滤器包含不同的字段,处理完把 args
返回,实现一套 Rust struct 和 Lua table 的互转就可以了,调用也是统一的。
改动不大,如果原来是 function(context)
,现在就相当于 function({ context })
,如果原来是 function(text, context)
,现在就相当于 function({ text, context })
。当然这是 JavaScript 的语法,Lua 不能直接解包,例子见:插件系统。
没有了转换来转换去,实际完成后我笔记本完全节能模式,400 多篇文章的生成速度从 3 秒多降低到 700 多毫秒这个量级,性能模式只要 300 毫秒,没想到性能提高这么多,开心。
不过把 Clap 从 2.33.0 升级到 4.2.5 后,压缩包从 1.5M 增长到了 2M 多,按百分比算膨胀了不少。😜
下载链接:Beex 0.8.2