Rust 生態系統的非官方指南

banq發表於2022-11-11

與 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]為遊戲開發用例最佳化的快速數學庫


更多點選標題

相關文章