在 Rust 的開發過程中,Cargo 是一個不可或缺的工具,它不僅是 Rust 的建置工具,還是專案管理器和套件管理器。無論是建立新專案、管理依賴、進行測試,還是發佈程式,Cargo 都可以輕鬆處理。本文將帶你深入了解 Cargo 的功能及其在專案中的應用。
Cargo 是 Rust 的官方套件管理和建置工具,與 Rust 編譯器 rustc 共同工作。它負責:
這些功能讓開發者能更專注於程式的開發,而不需要擔心編譯和依賴的管理。
我們從一個簡單的步驟開始:使用 Cargo 建立一個新的 Rust 專案。
首先,開啟終端,然後執行以下命令:
cargo new my_project
這會自動建立一個新的專案目錄 my_project,並包含以下結構:
my_project
├── Cargo.toml # Cargo 配置文件
└── src
└── main.rs # Rust 代碼入口
在這裡,Cargo.toml 文件是專案的配置文件,而 src/main.rs 則是專案的主要代碼文件。
Cargo.tomlCargo.toml 是專案的配置文件,包含專案的基本資訊和依賴項目。例如:
[package]
name = "my_project" # 專案名稱
version = "0.1.0" # 專案版本
edition = "2021" # Rust 版本
[dependencies]
在這個文件中,你可以定義專案的依賴關係(dependencies)和其他設定。稍後我們會介紹如何添加依賴。
建立專案後,進入專案目錄並運行以下命令來編譯和執行你的 Rust 專案:
cargo run
這會自動編譯你的專案並運行生成的可執行文件。如果一切正常,你應該會看到:
Hello, world!
Rust 的強大之處在於其社群提供了大量的第三方庫,你可以通過 Cargo 輕鬆添加和管理依賴項目。這些庫都可以在 crates.io(Rust 的官方套件管理網站)上找到。
要在專案中使用第三方庫(crate),只需在 Cargo.toml 中添加依賴項。例如,我們想要使用 serde 來處理 JSON,可以將 serde 添加到 Cargo.toml:
[dependencies]
serde = "1.0"
serde_json = "1.0"
添加依賴項後,執行 cargo build 或 cargo run,Cargo 會自動從 crates.io 下載並編譯依賴。所有的依賴會被下載到 Cargo.lock 文件中,這確保了專案在不同環境下依賴版本的一致性。
Cargo 提供了多種指令來幫助開發者進行開發、測試和部署。
cargo buildcargo build 用於編譯專案。如果你只是想編譯但不運行代碼,可以使用這個命令。
cargo build
這會將可執行文件放置在 target/debug 目錄下。
cargo runcargo run 會編譯並運行專案,這是最常用的開發命令。它可以幫助你在開發過程中快速檢查程式的運行情況。
cargo testRust 擁有內建的測試框架,你可以通過 cargo test 來執行專案中的單元測試和集成測試。
cargo test
這會自動查找專案中的測試函數並執行它們。
cargo clean當你想清理專案生成的二進制文件時,可以使用 cargo clean。這會刪除 target 目錄下的所有生成文件,讓專案恢復到乾淨狀態。
cargo clean
cargo doccargo doc 用於生成專案的文件。Rust 擁有強大的文件系統,可以從代碼自動生成文件。執行 cargo doc --open 後,Cargo 會生成一個 HTML 文件並打開它,讓你瀏覽專案的文件。
cargo doc --open
當專案開發完成並準備發佈時,Cargo 提供了 cargo build --release 來進行優化編譯。這個命令會啟用各種優化選項,生成更快的二進制文件。
cargo build --release
生成的可執行文件會被放置在 target/release 目錄下。
如果你想將專案發佈到 crates.io 並供其他開發者使用,首先需要在 crates.io 註冊帳號,然後使用 cargo publish 將你的包上傳。
cargo publish
發佈前,你需要確保 Cargo.toml 文件中有正確的版本號和描述信息。
Cargo 支援多個專案共用同一個工作空間(workspace),這對於大型專案非常有用。你可以將多個相互依賴的子專案組織在同一個工作空間中。
首先,建立一個新的專案目錄,然後在其中建立一個 Cargo.toml 文件,定義工作空間:
[workspace]
members = ["project_a", "project_b"]
然後,在該目錄下建立 project_a 和 project_b 子專案:
cargo new project_a
cargo new project_b
這樣,你可以在同一個工作空間中編譯和管理多個專案。
為了展示 Cargo 的強大功能,我們來看一個完整的範例專案,它使用了 serde 庫來解析 JSON。
cargo new serde_example
cd serde_example
Cargo.toml 文件:[package]
name = "serde_example"
version = "0.1.0"
edition = "2021"
[dependencies]
serde = "1.0"
serde_json = "1.0"
main.rs 文件:use serde::{Deserialize, Serialize};
use serde_json;
#[derive(Serialize, Deserialize, Debug)]
struct Task {
title: String,
completed: bool,
}
fn main() {
// 序列化:將結構體轉換為 JSON
let task = Task {
title: String::from("完成 Rust 學習"),
completed: false,
};
let serialized = serde_json::to_string(&task).unwrap();
println!("序列化結果:{}", serialized);
// 反序列化:從 JSON 轉換為結構體
let deserialized: Task = serde_json::from_str(&serialized).unwrap();
println!("反序列化結果:{:?}", deserialized);
}
cargo run
輸出結果:
序列化結果:{"title":"完成 Rust 學習","completed":false}
反序列化結果:Task { title: "完成 Rust 學習", completed: false }
Cargo 是 Rust 開發者最重要的工具之一,無論是專案管理、依賴處理、測試還是發佈,Cargo 都能夠輕鬆完成。通過 Cargo.toml 文件,可以輕鬆管理專案的依賴與設定,並通過 Cargo 指令進行專案的建置和測試。