Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2022,开始 Rust 之旅 #637

Open
axetroy opened this issue Mar 27, 2022 · 1 comment
Open

2022,开始 Rust 之旅 #637

axetroy opened this issue Mar 27, 2022 · 1 comment
Labels

Comments

@axetroy
Copy link
Owner

axetroy commented Mar 27, 2022

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 axetroy added the 分享 label Mar 27, 2022
@hhhaiai
Copy link

hhhaiai commented Dec 4, 2024

哈哈,啥时候分享

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants