iT邦幫忙

2024 iThome 鐵人賽

DAY 12
0

在 Rust 的開發過程中,Cargo 是一個不可或缺的工具,它不僅是 Rust 的建置工具,還是專案管理器和套件管理器。無論是建立新專案、管理依賴、進行測試,還是發佈程式,Cargo 都可以輕鬆處理。本文將帶你深入了解 Cargo 的功能及其在專案中的應用。


一、什麼是 Cargo?

Cargo 是 Rust 的官方套件管理和建置工具,與 Rust 編譯器 rustc 共同工作。它負責:

  • 建立專案結構。
  • 下載和管理第三方庫(依賴項目)。
  • 自動處理專案的編譯和建置。
  • 執行單元測試和集成測試。
  • 打包和發佈 Rust 專案。

這些功能讓開發者能更專注於程式的開發,而不需要擔心編譯和依賴的管理。


二、使用 Cargo 建立新專案

我們從一個簡單的步驟開始:使用 Cargo 建立一個新的 Rust 專案。

1. 建立專案

首先,開啟終端,然後執行以下命令:

cargo new my_project

這會自動建立一個新的專案目錄 my_project,並包含以下結構:

my_project
├── Cargo.toml    # Cargo 配置文件
└── src
    └── main.rs   # Rust 代碼入口

在這裡,Cargo.toml 文件是專案的配置文件,而 src/main.rs 則是專案的主要代碼文件。

2. 瞭解 Cargo.toml

Cargo.toml 是專案的配置文件,包含專案的基本資訊和依賴項目。例如:

[package]
name = "my_project"          # 專案名稱
version = "0.1.0"            # 專案版本
edition = "2021"             # Rust 版本

[dependencies]

在這個文件中,你可以定義專案的依賴關係(dependencies)和其他設定。稍後我們會介紹如何添加依賴。

3. 編譯與執行專案

建立專案後,進入專案目錄並運行以下命令來編譯和執行你的 Rust 專案:

cargo run

這會自動編譯你的專案並運行生成的可執行文件。如果一切正常,你應該會看到:

Hello, world!

三、管理依賴

Rust 的強大之處在於其社群提供了大量的第三方庫,你可以通過 Cargo 輕鬆添加和管理依賴項目。這些庫都可以在 crates.io(Rust 的官方套件管理網站)上找到。

1. 添加依賴

要在專案中使用第三方庫(crate),只需在 Cargo.toml 中添加依賴項。例如,我們想要使用 serde 來處理 JSON,可以將 serde 添加到 Cargo.toml

[dependencies]
serde = "1.0"
serde_json = "1.0"

2. 自動下載與編譯依賴

添加依賴項後,執行 cargo buildcargo run,Cargo 會自動從 crates.io 下載並編譯依賴。所有的依賴會被下載到 Cargo.lock 文件中,這確保了專案在不同環境下依賴版本的一致性。


四、Cargo 的其他指令

Cargo 提供了多種指令來幫助開發者進行開發、測試和部署。

1. cargo build

cargo build 用於編譯專案。如果你只是想編譯但不運行代碼,可以使用這個命令。

cargo build

這會將可執行文件放置在 target/debug 目錄下。

2. cargo run

cargo run 會編譯並運行專案,這是最常用的開發命令。它可以幫助你在開發過程中快速檢查程式的運行情況。

3. cargo test

Rust 擁有內建的測試框架,你可以通過 cargo test 來執行專案中的單元測試和集成測試。

cargo test

這會自動查找專案中的測試函數並執行它們。

4. cargo clean

當你想清理專案生成的二進制文件時,可以使用 cargo clean。這會刪除 target 目錄下的所有生成文件,讓專案恢復到乾淨狀態。

cargo clean

5. cargo doc

cargo doc 用於生成專案的文件。Rust 擁有強大的文件系統,可以從代碼自動生成文件。執行 cargo doc --open 後,Cargo 會生成一個 HTML 文件並打開它,讓你瀏覽專案的文件。

cargo doc --open

五、發佈專案

當專案開發完成並準備發佈時,Cargo 提供了 cargo build --release 來進行優化編譯。這個命令會啟用各種優化選項,生成更快的二進制文件。

cargo build --release

生成的可執行文件會被放置在 target/release 目錄下。

發佈到 crates.io

如果你想將專案發佈到 crates.io 並供其他開發者使用,首先需要在 crates.io 註冊帳號,然後使用 cargo publish 將你的包上傳。

cargo publish

發佈前,你需要確保 Cargo.toml 文件中有正確的版本號和描述信息。


六、Cargo 的工作空間(Workspace)

Cargo 支援多個專案共用同一個工作空間(workspace),這對於大型專案非常有用。你可以將多個相互依賴的子專案組織在同一個工作空間中。

1. 建立工作空間

首先,建立一個新的專案目錄,然後在其中建立一個 Cargo.toml 文件,定義工作空間:

[workspace]
members = ["project_a", "project_b"]

然後,在該目錄下建立 project_aproject_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 指令進行專案的建置和測試。


上一篇
[Day 11] Rust 的模組與套件管理:如何引用模組
下一篇
[Day 13] 使用迭代器與集合:Rust 中常見的集合處理
系列文
從 Python 開發者的角度學習 Rust —— 從語法基礎到實戰應用14
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言