Cargo 教程

以下是用中文详细讲解 Rust 的包管理器和构建工具 Cargo 的教程,涵盖其基本功能、使用方法和常见场景,适合初学者和有一定经验的 Rust 开发者。教程将简洁明了,逐步介绍 Cargo 的核心概念和操作,并提供实用示例。


1. Cargo 简介

Cargo 是 Rust 的官方构建工具和包管理器,类似于 Python 的 pip 或 Node.js 的 npm。它用于:

  • 创建和管理 Rust 项目。
  • 管理依赖(crates,Rust 的包)。
  • 编译、运行和测试代码。
  • 发布和分享库。

Cargo 随 Rust 安装(通过 rustup)自动包含,无需单独安装。


2. 验证 Cargo 安装

在终端运行以下命令,检查 Cargo 是否正确安装:

cargo --version

输出示例:

cargo 1.81.0 (2024-09-12)

如果未显示版本,确保 Rust 环境已正确配置(参考 Rust 环境搭建教程)。


3. 创建新项目

Cargo 提供命令快速创建标准化的 Rust 项目结构。

3.1 创建项目

cargo new my_project
cd my_project

这会生成以下目录结构:

my_project/
├── Cargo.toml
└── src/
    └── main.rs
  • Cargo.toml:项目的配置文件,包含元数据和依赖信息。
  • src/main.rs:默认的主程序文件,包含 fn main() 函数。

示例 Cargo.toml

[package]
name = "my_project"
version = "0.1.0"
edition = "2021"

[dependencies]

示例 src/main.rs

fn main() {
    println!("Hello, world!");
}

3.2 运行项目

在项目目录下运行:

cargo run

输出:

   Compiling my_project v0.1.0 (/path/to/my_project)
    Finished dev [unoptimized + debuginfo] target(s) in 0.5s
     Running `target/debug/my_project`
Hello, world!
  • cargo run 自动编译并运行项目。
  • 编译后的可执行文件位于 target/debug/

3.3 构建项目

仅编译项目,不运行:

cargo build
  • 生成的可执行文件在 target/debug/
  • 发布模式(优化编译):
  cargo build --release
  • 可执行文件在 target/release/,体积更小,性能更高。

4. 管理依赖

Cargo 通过 Cargo.toml 管理项目依赖,依赖的包称为 crates,通常从 crates.io 下载。

4.1 添加依赖

编辑 Cargo.toml,在 [dependencies] 部分添加依赖。例如,添加 rand 库(用于生成随机数):

[dependencies]
rand = "0.8.5"

4.2 使用依赖

src/main.rs 中使用 rand

use rand::Rng;

fn main() {
    let random_num = rand::thread_rng().gen_range(1..=100);
    println!("随机数: {}", random_num);
}

运行 cargo buildcargo run,Cargo 会自动下载并编译 rand 及其依赖。

4.3 依赖版本说明

  • rand = "0.8.5":指定具体版本。
  • rand = "^0.8.5":允许次要版本更新(如 0.8.x,但不会升级到 0.9.x)。
  • rand = "*":使用最新版本(不推荐,可能会破坏兼容性)。

4.4 更新依赖

更新依赖到最新兼容版本:

cargo update

查看依赖树:

cargo tree

(需先安装:cargo install cargo-tree


5. 常用 Cargo 命令

以下是 Cargo 的核心命令,涵盖开发、测试和发布流程:

5.1 构建和运行

  • cargo build:编译项目(调试模式)。
  • cargo build --release:编译发布模式(优化)。
  • cargo run:编译并运行。
  • cargo check:快速检查代码是否可编译,不生成可执行文件。

5.2 测试

Cargo 支持运行单元测试和集成测试。

示例:在 src/main.rs 中添加测试:

#[cfg(test)]
mod tests {
    #[test]
    fn it_works() {
        assert_eq!(2 + 2, 4);
    }
}

运行测试:

cargo test

输出:

running 1 test
test tests::it_works ... ok

5.3 格式化和检查

  • 格式化代码(遵循 Rust 风格指南):
  cargo fmt

(需安装 rustfmtrustup component add rustfmt

  • 静态分析(检查潜在问题):
  cargo clippy

(需安装 clippyrustup component add clippy

5.4 文档和发布

  • 生成文档:
  cargo doc --open
  • 文档生成在 target/doc/,并自动在浏览器打开。
  • 清理项目(删除 target/ 目录):
  cargo clean
  • 发布到 crates.io:
  cargo publish

(需先在 crates.io 注册并配置 API 令牌)。


6. 项目类型

Cargo 支持两种项目类型:

  1. 二进制项目(默认,包含 main.rs):
  • 用于生成可执行程序。
  • 示例:命令行工具。
  1. 库项目
  • 用于生成可重用的库,包含 lib.rs
  • 创建命令:
    bash cargo new --lib my_library

示例 Cargo.toml(库项目)

[package]
name = "my_library"
version = "0.1.0"
edition = "2021"

[lib]

name = “my_library” path = “src/lib.rs”


7. 配置 Cargo

7.1 自定义构建

在项目根目录创建 .cargo/config.toml,可以自定义构建行为。例如,设置国内镜像加速依赖下载:

[source.crates-io]
replace-with = 'ustc'

[source.ustc]

registry = “https://mirrors.ustc.edu.cn/crates.io-index”

常用镜像:

  • 中国科技大学:https://mirrors.ustc.edu.cn/crates.io-index
  • 清华大学:https://mirrors.tuna.tsinghua.edu.cn/crates.io-index

7.2 环境变量

设置环境变量以控制 Cargo 行为。例如:

export RUST_LOG=debug
cargo run

用于启用日志输出(需配合 env_logger 库)。


8. 高级功能

8.1 工作空间(Workspace)

工作空间允许多个相关项目共享 target/ 目录和依赖。创建工作空间:

  1. 创建目录并添加 Cargo.toml
   [workspace]
   members = ["project1", "project2"]
  1. project1project2 目录下分别创建子项目。

8.2 自定义构建脚本

Cargo.toml 中添加 [build-dependencies]build.rs 文件,用于自定义构建逻辑。例如,自动生成代码或编译 C 依赖。

示例 build.rs

fn main() {
    println!("cargo:rerun-if-changed=build.rs");
    // 自定义构建逻辑
}

8.3 条件编译

使用 cfg 属性或 features 控制条件编译。在 Cargo.toml 中定义特性:

[features]
default = []
extra = ["rand"]

在代码中使用:

#[cfg(feature = "extra")]
use rand::Rng;

9. 注意事项

  1. 依赖冲突
  • 如果多个依赖使用不同版本的同一 crate,可能导致冲突。cargo tree 可帮助诊断。
  1. 网络问题
  • 中国大陆用户建议配置镜像(如 USTC 或清华)加速依赖下载。
  1. 性能优化
  • 使用 cargo check 快速验证代码。
  • 发布时使用 --release 优化性能。
  1. 错误处理
  • 仔细阅读 Cargo 错误信息,通常包含修复建议。
  • 使用 cargo --verbose 获取详细日志。

10. 示例:构建一个简单的命令行工具

创建一个生成随机密码的工具:

  1. 创建项目:
   cargo new password_generator
   cd password_generator
  1. 编辑 Cargo.toml
   [package]
   name = "password_generator"
   version = "0.1.0"
   edition = "2021"

[dependencies]

rand = “0.8.5”

  1. 编辑 src/main.rs
   use rand::Rng;

   fn main() {
       let chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
       let password: String = (0..12)
           .map(|_| {
               let idx = rand::thread_rng().gen_range(0..chars.len());
               chars.chars().nth(idx).unwrap()
           })
           .collect();
       println!("生成的密码: {}", password);
   }
  1. 运行:
   cargo run

输出示例:

   生成的密码: kX9mPqW2nR5j

11. 总结

Cargo 是 Rust 开发的核心工具,简化了项目管理、依赖处理和构建流程。核心功能包括:

  • 创建项目:cargo new
  • 管理依赖:在 Cargo.toml 添加 crates。
  • 构建和运行:cargo buildcargo run
  • 测试和检查:cargo testcargo fmtcargo clippy
  • 高级功能:工作空间、自定义构建、条件编译。

通过本教程,你可以快速上手 Cargo 并开始开发 Rust 项目。如果需要更深入的内容(如发布到 crates.io、集成测试、或特定场景的配置),请告诉我!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注