返回文章列表

Rust 工具鏈提升開發效率與程式碼品質

Rust 語言的工具鏈在提升開發效率和程式碼品質方面扮演著至關重要的角色。本文將探討 rust-analyzer、rustfmt、Clippy 和 sccache 等工具,並提供如何在實際開發中有效利用它們的實務技巧。從程式碼自動完成、格式化到品品檢查和編譯加速,這些工具將協助開發者開發更穩健、高效的 Rust

程式語言 開發工具

Rust 工具鏈不僅止於 Cargo 專案管理,還包含提升開發效率和程式碼品質的關鍵工具。rust-analyzer 提供 IDE 整合,讓程式碼自動完成、跳轉定義和重構等功能更加完善。rustfmt 則能自動格式化程式碼,確保團隊風格一致性,減少程式碼審查的負擔。Clippy 靜態分析工具能找出程式碼中潛在的錯誤和效能問題,提供改進建議,提升程式碼的可靠性。而 sccache 則能有效利用快取機制,大幅縮短編譯時間,尤其在大型專案中效果顯著,加快開發迭代速度。

Rust 工具鏈介紹與實務應用

Rust 語言的成功不僅僅依賴於其語言本身的設計,還有賴於其強大的工具鏈支援。在本章中,我們將探討 Rust 開發者日常工作中不可或缺的工具,包括 rust-analyzerrustfmtClippysccache 等,並介紹如何在實際開發中充分利用這些工具提升開發效率和程式碼品質。

Rust 工具鏈概覽

在前一章中,我們討論了 Cargo 這個 Rust 的專案管理工具。除了 Cargo 之外,Rust 生態系統還提供了許多其他強大的工具,幫助開發者更高效地進行開發工作。雖然這些工具是可選的,但它們在實際開發中非常有價值,許多專案甚至要求使用它們。

主要工具介紹

工具名稱功能描述
CargoRust 的專案管理工具,用於編譯、測試和管理依賴項
rust-analyzer為支援語言伺服器協定的文字編輯器提供 Rust 語言支援
rustfmtRust 的程式碼風格格式化工具,提供自動化的程式碼格式化和檢查
ClippyRust 的程式碼品品檢查工具,提供多種程式碼品品檢查(稱為 lint)
sccache通用的編譯快取工具,用於提高大型專案的編譯速度

編輯器支援

Rust 語言在多種主流編輯器中都有良好的支援,以下是一些常見的編輯器及其對 Rust 的支援情況:

編輯器擴充套件名稱功能描述參考連結
Emacsrust-analyzer透過 LSP 提供 Rust 語言支援http://mng.bz/Jd7V
Emacsrust-mode原生 Emacs 擴充套件,用於增強 Rust 語言支援https://github.com/rust-lang/rust-mode
IntelliJ IDEAIntelliJ RustJetBrains 原生支援的 Rust 擴充套件https://www.jetbrains.com/rust/
Sublimerust-analyzer透過 LSP 提供 Rust 語言支援https://github.com/sublimelsp/LSP-rust-analyzer
Vimrust-analyzer透過 LSP 提供 Rust 語言支援https://rust-analyzer.github.io/manual.html#vimneovim
VS Coderust-analyzer透過 LSP 提供 Rust 語言支援https://rust-analyzer.github.io/manual.html#vs-code

嵌入式 Rust 開發與實踐

Rust 不僅適用於一般應用程式開發,還在嵌入式系統開發領域展現出其獨特的優勢。透過使用 QEMU 專案對 Cortex-M 裝置進行模擬,開發者可以在無需實際硬體的情況下進行嵌入式 Rust 的實驗。相關的範例程式碼可參考 https://github.com/rust-embedded/cortex-m-quickstart

對於非 ARM 架構的嵌入式開發,目前資源相對有限,但 Arduino Uno 平台是一個值得注意的例外。ruduino crate 為 Arduino Uno 提供了可重複使用的元件,使得開發者能夠在這個低成本、低功耗的嵌入式平台上進行開發。

記憶體管理

在嵌入式系統開發中,記憶體管理是一個重要的議題。當不需要動態記憶體分配時,可以使用 heapless crate 提供固定大小且無需動態分配的資料結構。若需要動態記憶體分配,則可以透過實作 GlobalAlloc trait 來建立自定義的分配器。對於某些嵌入式平台,如 Cortex-M 處理器,已經有現成的堆積分配器實作,例如 alloc-cortex-m crate。

使用 rust-analyzer 進行 Rust IDE 整合

rust-analyzer 工具是目前最成熟且功能最完整的 Rust 語言編輯器。它可以與任何實作 Language Server Protocol(LSP,https://microsoft.github.io/language-server-protocol)的編輯器整合。以下是 rust-analyzer 提供的一些功能:  程式碼自動完成  匯入插入  跳轉到定義  符號重新命名  檔案生成  重構  神奇自動完成(Magic completions)  行內編譯錯誤  型別和引數的嵌入提示(Inlay hints)  語義語法高亮  顯示行內參考檔案

在 VS Code 中,可以使用 CLI 安裝 rust-analyzer:

$ code --install-extension rust-lang.rust-analyzer

安裝完成後,VS Code 在處理 Rust 程式碼時將如圖 3.1 所示。注意在 fn main() 上方的 Run | Debug 按鈕,可以讓你一鍵執行或偵錯程式碼。

神奇自動完成(Magic completions)

rust-analyzer 具有 postfix 文字自動完成功能,可以快速完成常見任務,例如偵錯列印或字串格式化。熟悉神奇自動完成可以節省大量重複輸入的時間。此外,你只需要記住自動完成的運算式,而不需要記憶語法。

範例:建立測試模組

輸入 tmod 並選擇第一個自動完成結果,將建立一個測試模組範本,如下所示:

#[cfg(test)]
mod tests {
    use super::*;
    #[test]
    fn test_name() {
    }
}

範例:字串列印

輸入以下程式碼:

let bananas = 5.0;
let apes = 2.0;
"bananas={bananas} apes={apes} bananas_per_ape={bananas / apes}"

將遊標放在字串引號的末尾並輸入 .print,將轉換為 println 自動完成選項,如圖 3.2 所示。選擇 println 選項後,rust-analyzer 將程式碼轉換為:

let bananas = 5.0;
let apes = 2.0;
println!(
    "bananas={} apes={} bananas_per_ape={}",
    bananas,
    apes,
    bananas / apes
)

常用的神奇自動完成

表格 3.3 列出了幾個重要的神奇自動完成運算式。完整的神奇自動完成清單和其他 rust-analyzer 功能可參考手冊:https://rust-analyzer.github.io/manual.html。

表格 3.3 神奇自動完成範例

ExpressionResultDescription
“str {arg}".formatformat!(“str {}”, arg)使用引數格式化字串
“str {arg}".printlnprintln!(“str {}”, arg)使用引數列印字串
“".logLlog::level!(“str {}”, arg)使用指定層級記錄字串
pdeprintln!(“arg = {:?}”, arg)除錯列印(列印到 stderr)
ppdeprintln!(“arg = {:#?}”, arg)除錯漂亮列印(列印到 stderr)
expr.ref&exprBorrow expr
expr.refm&mut exprMutably borrow expr
expr.ifif expr {}將運算式轉換為 if 陳述式

使用 rustfmt 保持程式碼整潔

原始程式碼格式可能成為一個令人沮喪的來源,尤其是在有多個開發者的 Rust 專案中。對於單一貢獻者的專案來說,這不是什麼大問題,但是一旦有多個貢獻者,就可能出現程式碼風格的分歧。Rustfmt 是 Rust 對程式碼風格的回應,提供了一個慣用的、自動的和具有意見的樣式工具。

使用 cargo fmt

執行 cargo fmt --check -v 的範例輸出如圖 3.3 所示,該命令啟用了詳細模式和檢查模式。傳遞 --check 將導致命令在格式不符合預期時傳回非零值,這對於在持續整合系統上檢查程式碼格式非常有用。

程式碼解密:

  1. cargo fmt 是用於格式化 Rust 程式碼的命令。
  2. --check 選項用於檢查程式碼是否符合預期的格式,如果不符合則傳回非零值。
  3. -v 選項用於啟用詳細模式,顯示更多的資訊。

透過使用 rustfmt,可以保持程式碼的一致性和整潔性,從而提高開發效率和程式碼品質。

Rust 工具鏈:提升程式碼品質與開發效率

在軟體開發過程中,程式碼的品質與可維護性是至關重要的。Rust 語言提供了多種工具來幫助開發者提升程式碼品質,其中 rustfmtClippy 是兩款非常實用的工具。本文將探討如何使用這些工具來改善 Rust 程式碼的品質。

使用 rustfmt 進行程式碼格式化

程式碼格式化是保持專案一致性和可讀性的關鍵步驟。rustfmt 是一款能夠自動格式化 Rust 程式碼的工具,確保團隊成員之間的程式碼風格一致。

安裝 rustfmt

安裝 rustfmt 非常簡單,只需執行以下命令:

$ rustup component add rustfmt

安裝完成後,可以使用 Cargo 執行 rustfmt

$ cargo fmt

組態 rustfmt

rustfmt 提供了多種組態選項,以滿足不同團隊的需求。可以透過在專案根目錄下建立 .rustfmt.toml 檔案來組態 rustfmt。以下是一個示例組態:

format_code_in_doc_comments = true
group_imports = "StdExternalCrate"
imports_granularity = "Module"
unstable_features = true
version = "Two"
wrap_comments = true

內容解密:

  • format_code_in_doc_comments = true:對檔案註解中的程式碼進行格式化。
  • group_imports = "StdExternalCrate":定義匯入陳述式的分組順序。
  • imports_granularity = "Module":控制匯入陳述式的粒度。
  • unstable_features = true:啟用 nightly-only 功能。
  • version = "Two":選擇使用的 rustfmt 版本。
  • wrap_comments = true:自動換行註解。

使用 Clippy 提升程式碼品質

Clippy 是 Rust 的程式碼品質工具,提供超過 450 項檢查,幫助開發者發現潛在問題並改善程式碼品質。

安裝 Clippy

安裝 Clippy 的命令如下:

$ rustup component add clippy

安裝完成後,可以使用 Cargo 執行 Clippy

$ cargo clippy

Clippy 的檢查功能

Clippy 提供了多種型別的檢查,包括正確性、風格、效能等。例如,redundant_clone 檢查可以發現不必要的複製操作。以下是一個示例:

let my_string = String::new("my string");
println!("my_string='{}'", my_string.clone());

執行 Clippy 後,會得到以下警告:

warning: redundant clone
--> src/main.rs:3:37
|
3 | println!("my_string='{}'", my_string.clone());
| ^^^^^^^^ help: remove this

組態 Clippy

可以透過在專案根目錄下建立 .clippy.toml 檔案或在 Rust 原始檔中新增屬性來組態 Clippy。例如,可以使用 #[allow(clippy::too_many_arguments)] 屬性來停用特定檢查:

#[allow(clippy::too_many_arguments)]
fn function(
    a: i32, b: i32, c: i32, d: i32, e: i32, f: i32, g: i32, h: i32
) {
    // ...
}

內容解密:

  • 使用 #[allow(clippy::too_many_arguments)] 屬性可以停用特定函式的 too_many_arguments 檢查。
  • 可以根據專案需求組態 Clippy 以忽略特定的檢查。

Rust 工具鏈簡介

Rust 是一種系統程式語言,具備高效、安全及平行等特性。為了提高開發效率和程式碼品質,Rust 社群開發了一系列工具。本章將介紹幾種重要的 Rust 工具,包括 Clippy、sccache 及 rust-analyzer,並探討如何將這些工具整合到開發流程中。

使用 Clippy 提升程式碼品質

Clippy 是 Rust 的一個 lint 工具,用於檢查程式碼中的潛在錯誤和改進建議。它可以幫助開發者寫出更安全、更高效的程式碼。

設定 Clippy

Clippy 可以透過設定檔 .clippy.toml 進行客製化。例如,可以調整 too-many-arguments-threshold 的值來改變函式引數數量的閾值。

too-many-arguments-threshold = 10

自動套用 Clippy 的建議

Clippy 可以自動修正某些問題。執行以下命令即可自動套用建議:

$ cargo clippy --fix -Z unstable-options

在 CI/CD 中使用 Clippy

建議將 Clippy 整合到 CI/CD 流程中,以確保程式碼品質。以下是一個使用 GitHub Actions 的範例:

on: [push]
name: CI
jobs:
  clippy:
    name: Rust project
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Install Rust toolchain with Clippy
        uses: actions-rs/toolchain@v1
        with:
          toolchain: stable
          components: clippy
      - name: Run Clippy
        uses: actions-rs/cargo@v1
        with:
          command: clippy
          args: --all-targets --all-features -- -D warnings

內容解密:

  1. on: [push]:指定當程式碼推播到倉函式庫時觸發 CI 流程。
  2. jobs:定義 CI 流程中的任務。
  3. clippy:指定任務名稱。
  4. runs-on: ubuntu-latest:指定執行任務的環境。
  5. steps:定義任務中的步驟。
  6. uses: actions/checkout@v2:簽出程式碼。
  7. uses: actions-rs/toolchain@v1:安裝 Rust 工具鏈和 Clippy。
  8. uses: actions-rs/cargo@v1:執行 Clippy。

使用 sccache 加速編譯

sccache 是一個通用編譯快取工具,可以用於加速 Rust 程式的編譯。

安裝 sccache

可以使用 Cargo 安裝 sccache:

$ cargo install sccache

設定 sccache

可以透過環境變數或設定檔來設定 sccache。例如,可以設定 SCCACHE_REDIS 環境變數來使用 Redis 作為後端儲存:

$ export SCCACHE_REDIS=redis://10.10.10.10/sccache

使用 sccache

設定 RUSTC_WRAPPER 環境變數即可啟用 sccache:

$ export RUSTC_WRAPPER=`which sccache`
$ cargo build

內容解密:

  1. cargo install sccache:安裝 sccache。
  2. export SCCACHE_REDIS=redis://10.10.10.10/sccache:設定 Redis 後端儲存。
  3. export RUSTC_WRAPPER=which sccache``:啟用 sccache。
  4. cargo build:使用 sccache 編譯程式。

與 IDE 整合

rust-analyzer 是一個語言伺服器,可以與多種 IDE 整合,提供程式碼自動補全、錯誤檢查等功能。

安裝 rust-analyzer

可以使用以下命令安裝 rust-analyzer 的 VS Code 擴充功能:

$ code --install-extension matklad.rust-analyzer

使用 rust-analyzer

開啟任何 Rust 專案即可自動啟用 rust-analyzer。

內容解密:

  1. code --install-extension matklad.rust-analyzer:安裝 rust-analyzer 擴充功能。
  2. 開啟 Rust 專案:自動啟用 rust-analyzer。