• Github 中文镜像
Sign inSign up
Watch966
Star102.4k
Fork61.8k
Tag: beex
Switch branches/tags
Branches
Tags
  • master
K / 代码管理的思考和 Beex 插件系统更新 0.8.2.md
移动浏览 Clone
加载中...
到移动设备上浏览
19 lines 3.91 kB
First commit on 19 May 2023

    太长不读

    时隔两年,再次更新 Beex。效果:

    我笔记本完全节能模式,400 多篇文章的生成速度从 3 秒多降低到 700 多毫秒这个量级,性能模式只要 300 毫秒。

    项目管理的实践

    原来我写自己的程序是每个项目一个 Git 库,这么多年实践下来最大的问题是代码复用全靠 Ctrl + CCtrl + 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