【Rust自学】14.5. cargo工作空间(Workspace) 14.5 cargo 工作空间 (Workspace)14.5.1 为什么需要 Cargo Workspace假如说我们构建了一个二进制 crate里面既有库又有应用程序。随着项目规模不断增长库 crate 可能不断变大。在这种情况下通常会把它拆为多个包。针对这种需求Rust 提供了 Cargo 工作空间也就是 cargo workspace。Cargo workspace 会帮助管理多个相互关联且需要协同开发的 crate。其本质是一套共享同一个Cargo.lock和输出文件的包。14.5.2 使用 Workspace有多种方式可以创建工作空间workspace。做一个例子这个工作空间里有 1 个二进制 crate 和 1 个库 crate- 二进制 crate 里有main函数依赖于库 crate。- 其中一个库 crate 提供一个叫add_one的函数。1. 创建 Workspace 目录首先为工作空间创建一个目录我取名叫add。在终端输入以下命令$ mkdir add $ cd add2. 在主项目中使用 Workspace接下来在add目录中创建将配置整个工作区的Cargo.toml文件。该文件不会有[package]部分。相反它将以[workspace]部分开头[workspace] resolver 2 members [ adder, ]adder就是我给二进制 crate 取的名这个列表可以继续添加更多成员。3. 添加库$ cargo new adder Creating binary (application) adder package通过这个命令创建了addercrate位于目录add/adder下。此时整个项目的结构如下├── Cargo.lock ├── Cargo.toml ├── adder │ ├── Cargo.toml │ └── src │ └── main.rs └── target需要注意的是这时候我们既可以对add这个项目使用cargo build也可以对add下的addercrate 使用cargo build。但是生成的target目录和Cargo.lock文件只会有一个都在add目录下而addercrate 的构建产出物也会存放在这里。因为工作空间中的各个 crate 往往是相互依赖的每个目录都有自己的target就会导致开发者不得不反复编译工作空间里的其余 crate。接下来添加其它 crate另一个 crate 叫add_one修改工作空间信息[workspace] resolver 2 members [ adder, add_one, ]使用cargo new添加库记得使用--lib标志来把它声明为 library crate$ cargo new add_one --lib Creating library add_one package现在整个项目的结构是├── Cargo.lock ├── Cargo.toml ├── add_one │ ├── Cargo.toml │ └── src │ └── lib.rs ├── adder │ ├── Cargo.toml │ └── src │ └── main.rs └── target4. 编写代码在add_one/src/lib.rs文件中添加一个add_one函数和一个简单的单元测试pub fn add_one(x: i32) - i32 { x 1 } #[cfg(test)] mod tests { use super::*; #[test] fn it_works() { assert_eq!(3, add_one(2)); } }现在我们可以让adder包和我们的二进制文件依赖于add_one。首先需要添加路径依赖add_one到adder/Cargo.toml因为 Cargo 并不假设工作区中的 crate 会相互依赖因此我们需要明确依赖关系。在adder/Cargo.toml中这么写[dependencies] add_one { path ../add_one }接下来让我们使用来自add_onecrate 的add_one函数。打开adder/src/main.rs在顶部添加use来把add_one引入作用域然后修改main函数来调用add_one函数。use add_one; fn main() { let num 10; println!(Hello, world! {num} plus one is {}!, add_one::add_one(num)); }5. 编译对add这个项目使用cargo build$ cargo build Compiling add_one v0.1.0 (file:///projects/add/add_one) Compiling adder v0.1.0 (file:///projects/add/adder) Finished dev profile [unoptimized debuginfo] target(s) in 0.11s没有报错正常运行。6. 测试我们还可以通过使用-p标志并指定我们要测试的包的名称从顶级目录中对工作区中的一个特定包运行测试。比如说仅测试add_one函数$ cargo test -p add_one Finished test profile [unoptimized debuginfo] target(s) in 0.00s Running unittests src/lib.rs (target/debug/deps/add_one-bd89fda78e7f92a7) running 1 test test tests::it_works ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests add_one running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s如果将工作区中的 crate 发布到 crates.io则工作区中的每个 crate 都需要单独发布。与cargo test一样我们可以使用-p指定工作区中要发布的特定包并写出想要发布的包名称。

本月热点