31·工程化入门

Crate 与 Package

Crate 与 Package

学习目标

  1. 理解 Package、Crate、Module 的关系
  2. 区分二进制 crate 和库 crate
  3. 掌握 Cargo.toml 配置

核心概念

层级关系

Package(一个 Cargo.toml)
  └── Crate(编译单元)
       ├── 二进制 crate(src/main.rs)
       └── 库 crate(src/lib.rs)
            └── Module(代码组织)

二进制 vs 库

// src/main.rs — 二进制 crate 入口
fn main() {
    my_lib::greet("World");
}

// src/lib.rs — 库 crate 入口
pub fn greet(name: &str) {
    println!("Hello, {}!", name);
}

多二进制 crate

src/
├── main.rs           // 默认二进制
├── lib.rs            // 库
└── bin/
    ├── tool1.rs      // cargo run --bin tool1
    └── tool2.rs      // cargo run --bin tool2

Cargo.toml 配置

[package]
name = "my_project"
version = "0.1.0"
edition = "2021"
description = "我的项目"
license = "MIT"

[lib]
name = "my_lib"
path = "src/lib.rs"

[[bin]]
name = "my_tool"
path = "src/bin/tool.rs"

[dependencies]
serde = "1.0"

[dev-dependencies]
# 只在测试时使用
tempfile = "3"

crate 路径

// 绝对路径(从 crate 根开始)
crate::module::function();

// 相对路径
self::function();
super::function();  // 父模块

实践练习

练习 1:创建库项目

cargo new my_math --lib
// src/lib.rs
pub fn add(a: i32, b: i32) -> i32 { a + b }
pub fn multiply(a: i32, b: i32) -> i32 { a * b }

// src/main.rs(如果需要可执行文件)
use my_math::{add, multiply};

fn main() {
    println!("{}", add(2, 3));
    println!("{}", multiply(4, 5));
}

小结

概念说明
Package一个 Cargo.toml 管理的项目
Crate编译单元(二进制或库)
Module代码组织单元
src/main.rs二进制 crate 入口
src/lib.rs库 crate 入口

练习编辑器

rust
Loading...