01 / 10 · 15 分钟
新建一个 crate
在教程仓库外面 cargo new。cargo run 打出灯塔山脊。
你的项目里会动到:Cargo.toml · src/main.rs · src/lib.rs
你要写的程序叫 fieldlog,一本五天的野外日志。样例旅程是灯塔山脊,2026-09-18 到 2026-09-22,47.2 km,爬升 2240 m。第 3 天在鞍部遇上暴风雨。咖啡 80 g,每天 30 g,只够两个早晨。
从这里开始,不要改本仓库里的 fieldlog/。那个目录是写完以后的对照,网站上的报告也从它生成。你的代码放在别的目录,例如 ~/code/fieldlog。十章结束时,你的 crate 能 cargo test,能 cargo run -- brief,也能写出 HTML。对照目录里多一个 summary.rs,那是给网站准备 JSON 的,你不用写。
先有一个能编译的项目
还没装 Rust 的话,先看环境页。装好之后,在教程仓库外面执行下面两条命令。不要加 --lib:默认的 cargo new 会留下 src/main.rs,这一章再自己加 src/lib.rs。
这时还是 cargo 自带的 Hello, world!
cargo new fieldlog
cd fieldlog
cargo run现在目录里应该有 Cargo.toml、src/main.rs,还没有别的 Rust 文件。把 main.rs 换成下面这份。它调用库里的 banner()。库文件还没写,所以这一步先别 cargo run。
替换 src/main.rs。
fn main() {
println!("{}", fieldlog::banner());
}接着新建 src/lib.rs。Cargo 看到这个文件,就会把库和二进制编在一起。二进制在库外面,所以 banner 要 pub。这里没有 mod。不要从后面的章节抄模块列表过来,那些文件还不存在,编译会直接失败。
新建 src/lib.rs。整份文件就是这些。
pub fn banner() -> &'static str {
"灯塔山脊 · 2026-09-18 到 2026-09-22"
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn banner_names_the_traverse() {
let text = banner();
assert!(text.contains("灯塔山脊"));
assert!(text.contains("2026-09-18"));
assert!(text.contains("2026-09-22"));
}
}灯塔山脊 · 2026-09-18 到 2026-09-22
检查点
cargo test cargo run
测试通过。终端打出上面那一行。你的项目里仍然只有 main.rs 和 lib.rs。