Cargo 筆記
Cargo 為 Rust 為的套件管理工具,可以使用 Cargo 來新建專案與安裝套件。
相關指令
使用 cargo 指令新建 hello_world 的專案。
cargo new hell_world
執行完之後的檔案結構如下:
$ tree .
.
├── Cargo.toml
└── src
└── main.rs
1 directory, 2 files
檢查程式碼能否執行的指令。
cargo check
執行程式的指令。
cargo run
編譯執行檔案的指令。
cargo build
如果想要新增套件,可以在 Cargo.toml 中的 [dependencies] 底下加上想安裝的套件與版本號碼。
[dependencies]
rand = "0.8.5"
在執行下方的指令安裝套件。
cargo build
但建議還是使用 Cargo 來安裝套件,執行下方的指令安裝套件。
cargo add <package_name>
更新套件的指令。
cargo update
全域安裝套件
以 Tauri 為例,安裝 tauri-cli 的指令如下:
cargo install tauri-cli
安裝的套件預設會放在 $HOME/.cargo/bin 底下 (MacOS)。
之後就可以使用 tauri 指令來建立專案。
cargo tauri init
執行測試
可以使用 cargo test 來執行測試。 測試執行會產生一個測試執行檔案。
cargo test
發佈設定檔 (Release Profiles)
Cargo 有兩個主要的設定檔:
dev設定檔會在當你對 Cargo 執行cargo build時所使用。release設定檔會在當你對 Cargo 執行cargo build --release時所使用。
dev 設定檔預設定義為適用於開發時使用,而 release 設定檔預設定義為適用於發佈時使用。
# opt-level 設定控制了 Rust 對程式碼進行優化的程度,範圍從 0 到 3
# 0: 不進行優化
# 3: 進行最大優化,但會增加編譯時間
[profile.dev]
opt-level = 0
[profile.release]
opt-level = 3
對於完整的設置選項與每個設定檔的預設列表,請查閱 Cargo 的技術文件。
發佈 Crate 到 Crates.io
除了從 crates.io 下載 Rust 套件,我們也可以自己寫套件,並將其推送至 crates.io 讓別人來使用。
Rust 與 Cargo 有許多功能可以幫助其他人更容易找到你發佈的套件。下面會一一介紹。
寫上有幫助的技術文件註解
Rust 中可以使用 /// 來寫技術文件註解,這可以用來產生 HTML 技術文件。
/// Adds one to the number given.
///
/// # Examples
///
/// ```
/// let arg = 5;
/// let answer = my_crate::add_one(arg);
///
/// assert_eq!(6, answer);
/// ```
pub fn add_one(x: i32) -> i32 {
x + 1
}
上面的 # Examples 可以建立一個名為 Example 的文件段落,以下是常用的技術文件段落:
- Panics:說明該函式可能會導致恐慌的情況,請確保使用者沒有在這些情況下使用該函式。
- Errors:如果函式會回傳
Result,需要說明哪種情況下可能會出現錯誤,幫助使用者處理所有可能發生的錯誤。 - Safety:如果函式是
unsafe的話,需要說明為什麼這個函式是不安全的,並提及函式預期呼叫者要確保哪些不便條件 (invariants)。
將技術文件註解作為測試
在技術文件註解加上範例程式還有一個好處,就是執行 cargo test 時,文件中範例程式也會一起被執行並顯示測試結果。確保技術文件與程式碼是同步的,不會修改程式碼後,忘記修改文件。
包含項目結構的文件註解
用來描述整個 crate 或是模組的的說明文件,使用 //!。與剛剛的技術文件不同,這種文件後面不會有程式。通常會放在 crate 的源頭檔案,例如 src/lib.rs。
//! # My Crate
//!
//! `my_crate` is a collection of utilities to make performing certain
//! calculations more convenient.
/// Adds one to the number given.
///
/// # Examples
///
/// ```
/// let arg = 5;
/// let answer = my_crate::add_one(arg);
///
/// assert_eq!(6, answer);
/// ```
pub fn add_one(x: i32) -> i32 {
x + 1
}
當執行 cargo doc --open,這些註解會顯示在技術文件的首頁。說明這個 crate 的主要用途。