对于较大型项目,随着功能的不断增加,规模的不断扩大,将面临如何组织项目的问题。在这种情况下,可以使用 Cargo workspace来组织和管理项目。
workspace可以用于管理多个依赖包,它允许在一个单独的项目中构建、测试和共享多个包。这一机制特别适用于大型项目,或者当想将一个项目拆分成多个较小的、可重用的组件时。
workspace可以帮助管理多个相关的包,通过共享同一个
Cargo.lock
文件和同一个输出目录(target),以及其他配置(比如发布配置)
在Rust出现workspace之前,独立管理多个相关的包可能非常困难。每个包都需要单独配置、编译和测试,这使得跨包的依赖管理和版本控制变得复杂。随着项目规模的增长,这种方法变得越来越不可持续。
为了解决这些问题,Rust引入了workspace概念,目的是简化这些工作,特别是在涉及多个包的场景中。workspace允许开发者在一个共享的环境中工作,其中所有包都可以被统一构建和测试,依赖关系也被智能地管理。
要在Rust中使用workspace,需要创建一个顶层的Cargo.toml
文件来定义workspace及其成员。
下面是一个简单的例子:
假设想创建一个名为my_workspace
的workspace,其中包含两个包:library
(一个库包)和app
(一个二进制包,依赖于library
)。
mkdir my_workspace
cd my_workspace
Cargo.toml
:在my_workspace
目录中,创建Cargo.toml
:
[workspace]
members = [
"library",
"app",
]
library
包:mkdir library
cd library
cargo init --lib
默认生成的lib.rs中会有如下内容:
pub fn add(left: usize, right: usize) -> usize {
left + right
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_works() {
let result = add(2, 2);
assert_eq!(result, 4);
}
}
app
包:cd ../ # 回到workspace根目录
mkdir app
cd app
cargo init
在app
的Cargo.toml
中添加对library
的依赖:
[dependencies]
library = { path = "../library" }
并且在app/main.rs中,调用一下library中的add函数:
use library;
fn main() {
println!("Hello, world!");
let rs = library::add(1, 6);
println!("最终结果为: {}", rs);
}
在workspace根目录下运行cargo build
,或cargo run -p app
来构建或运行特定的包。
(只会有一个全局的target目录,即便在app目录下执行cargo build,也不会在app目录下再生成一个target文件夹)
综上,通过使用workspace,Rust项目可以更轻松地管理多包的构建、测试和依赖关系,特别是对于大型或分解成多个组件的项目而言。