Rust 生态系统的非官方指南

22-11-11 banq

与 Python 和 Go 等其他编程语言相比,Rust 的标准库非常小,仅包含标准库中的核心数据结构,所有其他功能都外包给 3rd 方生态系统 crate,新 Rust 开发人员的一个常见抱怨是他们不知道从哪里开始:他们应该使用哪些crate,应该信任哪些crate。

另请参阅lib.rs,它采用更自动化的方法(按下载次数排序 crate)并且还具有出色的搜索功能。

用于处理 Rust 项目的开发人员工具:
工具链管理:

  • rustup安装、管理和升级 rustc、cargo、clippy、rustfmt 等的版本。

linter:

  • clippy官方的 Rust linter。

代码格式:
  • rustfmt官方的 Rust 代码格式化程序。

交叉编译:

管理依赖项:
  • cargo-edit向 cargo 添加“cargo add”、“cargo rm”和“cargo upgrade”命令
  • cargo-outdated查找具有可用更新的依赖
  • cargo-audit检查依赖项以获取报告的安全漏洞
  • cargo-license列出所有依赖项的许可证
  • cargo-deny对您的代码和依赖项执行策略。


测试:

基准测试:

性能

调试宏:

发布自动化:

持续集成:



通用用途

随机数:

  • rand [docs]从标准库中分离出来的事实上的标准随机数生成库

时间和日期:
不幸的是,对于时间和计时之间哪个最好,没有明确的答案。在这两者之间自行评估,但请放心,两者都是值得信赖且维护良好的。
  • time [docs]一个更小、更简单的库。如果可以满足您的需求,则最好,但它提供的功能非常有限。
  • chrono [docs]最全面、功能最齐全的日期时间库,但因此更加复杂。


序列化(JSON、YAML 等):
有关支持的格式,请参见此处。
  • serde [docs]事实上的标准序列化库。与您正在使用的特定格式的 serde_json 等子 crate 结合使用。


常用表达:
  • 正则表达式 [docs]事实上的标准正则表达式库。非常快,但不支持更高级的功能,例如回溯。
  • fancy_regex [docs]如果需要,请使用正则表达式不支持的回溯等功能


UUID:
  • uuid [docs]实现生成和解析 UUID 和许多实用功能


临时文件:


Gzip(解)压缩:
  • flate2 [docs]默认使用纯 Rust 实现。使用功能标志选择加入系统 zlib。

插入排序的Map:
  • indexmap [docs]一个单独跟踪插入顺序并允许您按该顺序有效地迭代其元素的 HashMap


堆栈分配的数组:
  • arrayvec [docs]仅以 固定容量堆栈分配的数组
  • smallvec [docs]堆栈分配的数组,如果超过固定堆栈容量,则回退到堆
  • tinyvec [docs]在 100% 安全的 Rust 代码中堆栈分配的数组,但需要项目来实现 Default trait。


HTTP 请求:
  • reqwest [docs] HTTP 客户端。可用于同步和异步代码。需要 tokio 运行时。
  • ureq [docs]最小同步 HTTP 客户端,专注于简单性和最小化依赖关系。


错误处理

对于应用:

  • anyhow [docs]提供了一个可以保存任何错误的盒装错误类型,以及用于生成应用程序级堆栈跟踪的帮助程序。
  • color-eyre [docs]一个分支,可以让您更好地控制生成的错误消息的格式。如果您需要向最终用户显示错误消息,建议使用。否则无论如何都更简单。

对于库包:


日志记录

基于文本的日志记录:

  • tracking [docs]Tracing 现在是日志记录的首选 crate。
  • log [docs]如果您的需求很简单并且您没有使用任何异步代码,则可以使用更旧且更简单的 crate。


结构化日志记录:


语言扩展
扩展语言和/或标准库功能的通用实用程序。
惰性静态变量初始化:

  • once_cell [docs]具有更符合人体工程学的 API 的更新。有望纳入标准库。应该是所有新项目的首选。
  • lazy_static [docs]较旧。API 不太方便,但 crate 是稳定和维护的。


迭代器助手:


宏助手:
  • syn [docs]解析 rust 源代码
  • quote [docs]Quasi quoting rust(用于使用文字代码插入生成的代码)
  • paste [docs]连接和操作标识符


抽象不同的数字类型:
  • num [docs]诸如 Number、Add 等特性,允许您编写对特定数字类型通用的函数


安全类型转换:


位标志:


系统
用于与底层平台/操作系统的低级交互
内存映射文件:



库:
  • libc [docs]直接调用 libc 函数的绑定。


视窗(操作系统):
  • windows [docs]微软官方提供的用于与 windows API 交互的 crate
  • winapi [docs]与 Windows API 的旧绑定。非官方,但比windows-rs更完善


*nix (操作系统):
  • nix [docs]绑定到各种 *nix 系统函数。(Unix、Linux、MacOS 等)


联网
TCP、HTTP、GRPc 等。以及进行异步网络所需的执行器。

异步执行器
要在 Rust 中使用 async-await 进行异步编程,您需要一个运行时来执行驱动您的 Futures。
一般用途:

  • tokio [docs]Rust 生态系统中最古老的异步运行时,并且仍然得到最广泛的支持。推荐用于新项目。
  • async-std [docs]一个与 tokio 非常相似的新选项。它的 API 更接近于 std 库,但它没有 Tokio 那么多的吸引力。


io_uring:
  • glommio [docs]如果您需要 io_uring 支持,请使用。仍然有些实验性,但正在迅速成熟。


HTTP
HTTP 客户端和服务器库,以及较低级别的构建块。
类型和接口:

  • http [docs]`http` crate 实际上并不包含 HTTP 实现。只是有助于互操作性的类型和接口。


低级 HTTP 实现:
  • hyper [docs]低级 HTTP 实现(客户端和服务器)。实现 HTTP 1、2 和 3。最适用于 tokio 异步运行时,但可以支持其他运行时。


HTTP 客户端:
  • reqwest [docs]全脂 HTTP 客户端。可用于同步和异步代码。需要 tokio 运行时。
  • ureq [docs]最小同步 HTTP 客户端,专注于简单性和最小化依赖关系。


HTTP 服务器:
  • axum [docs]一个最小且符合人体工程学的框架。tokio 项目的官方部分。推荐用于大多数新项目。
  • actix-web [docs]一个以性能为中心的框架。所有 Rust 框架都很快,但如果您需要绝对最高的性能,请选择 actix-web。


GraphQL 服务器:


Socket网络套接字
本节包括供您仅使用 websockets 的库。但是请注意,上一节中的许多 HTTP 服务器框架也支持 websockets
低级:



一般用途:


gRPC

  • tonic [docs]gRPC over HTTP/2,完全支持异步代码。


数据库

SQL 数据库
多数据库:

  • sqlx [docs]适用于 Postgres、MySQL、SQLite 和 MS SQL。支持查询的编译时检查。异步:同时支持 tokio 和 async-std。


ORM:
  • sea-orm [文档]推荐。建立在 sqlx 之上。还有一个相关的 sea-query crate,它提供了一个没有完整 ORM 功能的查询构建器。
  • diesel [docs]稳定版本仅同步。预发布异步分支目前是 AGPL。在某些情况下可以提供更好的性能。


Postgres:


MySQL:


SQLite:


微软 SQL:


甲骨文:


其他数据库



实用程序
连接池:

  • deadpool [docs]一个简单的异步池,用于连接和任何类型的对象。


终端渲染
用于精美的终端渲染和 TUI。这里推荐的 crates 可以跨平台工作(包括 windows)。



并发

数据结构

  • 互斥体park_lot [docs]std::mutex 也可以正常工作。
  • 原子指针交换arc_swap [docs]用于共享有很多读者但很少有作者的数据


并发HashMap:
有关并发 HashMap 的比较基准,请参阅conc-map-bench


channel:
有关何时使用异步特定通道与通用通道的说明,请参阅communication-between-sync-and-async-code 。


并行计算:
  • rayon [docs]一次调用将顺序计算转换为并行计算 - `par_iter` 而不是 `iter`


图形
图形用户界面

GTK 和 Tauri 可能是唯一可以被描述为生产就绪且没有警告的选项。Rust 原生选项可用于简单项目,但仍然很不完整。
GTK:

  • gtk4-rs [docs]到 GTK4 的 Rust 绑定。尽管您经常需要使用 C 文档,但这些都得到了很好的支持。
  • relm4 [docs]位于 gtk4-rs 之上的高级库


基于网络的图形用户界面:
  • tauri [docs]类似电子的基于 Web 的 UI。除了它使用系统 webviews 而不是运送 chromium,而且非 UI 代码是用 Rust 而不是 node.js 编写的


Rust 原生 GUI:
  • iced [docs]具有良好 API 的保留模式 UI。它可用于基本应用程序,但缺少许多功能,包括多个窗口、图层和正确的文本渲染。
  • egui [docs]即时模式 UI。很多小部件。如果您的需求很简单并且您不需要自定义外观和感觉,那么开箱即用的最实用
  • druid [docs]比 iced 或 egui 有更好的基础,但是 API 非常笨重且文档记录不充分。
  • slint [docs]最完整的 rust-native UI 库。但请注意,它是双重 GPL3/商业许可。


文件对话框:
  • rfd [docs]平台原生打开/保存文件对话框。可与其他 UI 库结合使用。


游戏开发
游戏引擎:

  • bevy [docs]迄今为止最发达的 Rust 游戏引擎。它还为时过早,但已经令人印象深刻并且非常有用。
  • ggez [docs]仅适用于 2d 游戏的更简单的选项。
  • 3d 数学glam [docs]为游戏开发用例优化的快速数学库


更多点击标题

1