2022 年上半年,开始学习和使用 Rust 来写一些东西。
包括
未来如果没有其他特殊的需求的话,其他的工具也会使用 Rust 来完成
未来可能用 Rust 完成的重写计划
- dvm - Deno 的版本管理器
重写理由:
主要是之前用 Golang 来写的有点乱,无论是组织代码,还是写的逻辑,而且不够严谨
- kp - 根据端口 kill 掉进程
ref: https://github.com/axetroy/kp.js
ref: https://github.com/axetroy/kpv
重写理由:
上面几个都没有支持多平台
- gmock - 简约而不简单的 APIs mocker
原本使用 Golang 写的一个 API mock。 用来快速模拟 API 接口的。
在项目的初始阶段,还没有接口的时候,就可以先 mock,先开发页面,然后再进行接口的对接。
重写理由:
Golang 对于动态类型的解析不太友好,只能是 interface,然后再对于特定的类型进行解析。
而 gmock 的配置文件,应该是有许多动态类型的。
这里点 Rust 的 match
完胜. 例如匹配动态类型
let download_url = match resource_target {
ResourceTarget::Detailed(detail) => detail.url.clone(),
ResourceTarget::Executable(exe) => exe.executable.clone(),
ResourceTarget::Simple(url) => url.to_string(),
};
重写公司内部的构建系统
2021 年中,我用 Golang 写了一个公司项目的构建系统。
为什么需要这么一个构建系统?开源的一大把,不能用吗?
-
因为项目是面向 企业/政府 单位的,每一个程序包都有差异,Logo/主题/配置/功能 等等都可以定制化,所以不能简单的本机构建
-
项目构建时间较长,而且消耗大量的 CPU,基本上构建的时候 CPU 跑满,如果本地构建,那么基本上就无法做其他工作
-
根据第二点,构建需求非常频繁,如果一直本机构建,那么很浪费时间,很容易变成【打包工程师】
-
缺少一个程序包分发中心,如果本地构建,那么怎么把这个程序包发给相关人员?微信/QQ 发送?不说 Low 不 Low 的问题,文件难以留存。
-
应用不支持交叉编译,所以需要到特定的平台进行编译(比如龙芯 mips64el 架构)
基于以上原因,市面上的构建系统都无法满足。
我基于 Golang 开发了一套构建系统,很遗憾,涉及到公司的代码,无法开源。
简单分享一下架构:Master(1) - Agent(N) 的模型
Master: 对外提供 HTTP/WebSocket 接口和构建系统页面,处理构建请求,只有一个实例
Agent: 实际构建的 N 个实例,部署在 Windows/macOS/Linux 等平台
Master --构建配置--> Agent --构建结果--> Master
这里引入构建配置,里面写着克隆哪个项目,运行什么命令,然后打包什么文件返回给 master。
基本上比较灵活,所以稍微改一下配置,就可以用来构建其他项目。
这里有几个关键点:
- 节点之间的通讯协议选择 WebSocket,不是 tcp/HTTP
- 基于 WebSocket 的自定义 RPC
- 节点之间的上下文传递
开始尝试使用 Rust 重写构建系统
内部的构建系统,已经运行差不多一年了,目前没有发现什么大的问题。
考虑使用 Rust 对其进行重写,并且对其提炼,提取出公共部分,不包含公司的任何东西,做一个通用的构建系统。
开始写的时候没发现什么问题,直到写到通讯的部分。
Rust 没有 Golang 类似的 defer 语法,但可以通过宏来模拟 https://stackoverflow.com/questions/29963449/golang-like-defer-in-rust
Rust 没有官方的 Context,用于撤销异步任务。官方都没有集成 async await 的运行时,所以官方的 context 基本也没太可能。这里有 tokio 的替代品 tokio-context
Rust 没有纯 Rust 实现的 Git 客户端,而在 Golang 是有 go-git,这里最简单的实现是使用 Git 命令,然后替换到 git2-rs
最后
Ok,开始上吧,顺利的话,未来几个月之后,可能会开源出了。
大牛们的评论:朕有话说
还没有人评论哦,赶紧抢沙发!