blog icon indicating copy to clipboard operation
blog copied to clipboard

2022,开始 Rust 之旅

Open axetroy opened this issue 2 years ago • 0 comments

2022 年上半年,开始学习和使用 Rust 来写一些东西。

包括

未来如果没有其他特殊的需求的话,其他的工具也会使用 Rust 来完成

未来可能用 Rust 完成的重写计划

  1. dvm - Deno 的版本管理器

重写理由:

主要是之前用 Golang 来写的有点乱,无论是组织代码,还是写的逻辑,而且不够严谨

  1. kp - 根据端口 kill 掉进程

ref: https://github.com/axetroy/kp.js ref: https://github.com/axetroy/kpv

重写理由:

上面几个都没有支持多平台

  1. 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 写了一个公司项目的构建系统。

为什么需要这么一个构建系统?开源的一大把,不能用吗?

  1. 因为项目是面向 企业/政府 单位的,每一个程序包都有差异,Logo/主题/配置/功能 等等都可以定制化,所以不能简单的本机构建

  2. 项目构建时间较长,而且消耗大量的 CPU,基本上构建的时候 CPU 跑满,如果本地构建,那么基本上就无法做其他工作

  3. 根据第二点,构建需求非常频繁,如果一直本机构建,那么很浪费时间,很容易变成【打包工程师】

  4. 缺少一个程序包分发中心,如果本地构建,那么怎么把这个程序包发给相关人员?微信/QQ 发送?不说 Low 不 Low 的问题,文件难以留存。

  5. 应用不支持交叉编译,所以需要到特定的平台进行编译(比如龙芯 mips64el 架构)

基于以上原因,市面上的构建系统都无法满足。

我基于 Golang 开发了一套构建系统,很遗憾,涉及到公司的代码,无法开源。

简单分享一下架构:Master(1) - Agent(N) 的模型

Master: 对外提供 HTTP/WebSocket 接口和构建系统页面,处理构建请求,只有一个实例

Agent: 实际构建的 N 个实例,部署在 Windows/macOS/Linux 等平台

Master --构建配置--> Agent --构建结果--> Master

这里引入构建配置,里面写着克隆哪个项目,运行什么命令,然后打包什么文件返回给 master。

基本上比较灵活,所以稍微改一下配置,就可以用来构建其他项目。

这里有几个关键点:

  1. 节点之间的通讯协议选择 WebSocket,不是 tcp/HTTP
  2. 基于 WebSocket 的自定义 RPC
  3. 节点之间的上下文传递

开始尝试使用 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,开始上吧,顺利的话,未来几个月之后,可能会开源出了。

axetroy avatar Mar 27 '22 15:03 axetroy