Rust中Workspace的应用
对于较大型我的项目,随着性能的一直减少,规模的不断扩大,将面临如何组织我的项目的问题。在这种状况下,能够应用 Cargo workspace来组织和治理我的项目。
workspace能够用于治理多个依赖包,它容许在一个独自的我的项目中构建、测试和共享多个包。这一机制特地实用于大型项目,或者当想将一个我的项目拆分成多个较小的、可重用的组件时。
引入的背景
workspace能够帮忙治理多个相干的包,通过共享同一个Cargo.lock
文件和同一个输入目录(target),以及其余配置(比方公布配置)
在Rust呈现workspace之前,独立治理多个相干的包可能十分艰难。每个包都须要独自配置、编译和测试,这使得跨包的依赖治理和版本控制变得复杂。随着我的项目规模的增长,这种办法变得越来越不可继续。
为了解决这些问题,Rust引入了workspace概念,目标是简化这些工作,特地是在波及多个包的场景中。workspace容许开发者在一个共享的环境中工作,其中所有包都能够被对立构建和测试,依赖关系也被智能地治理。
如何应用
要在Rust中应用workspace,须要创立一个顶层的Cargo.toml
文件来定义workspace及其成员。
上面是一个简略的例子:
假如想创立一个名为my_workspace
的workspace,其中蕴含两个包:library
(一个库包)和app
(一个二进制包,依赖于library
)。
创立workspace目录:
mkdir my_workspacecd my_workspace
配置workspace的
Cargo.toml
:在
my_workspace
目录中,创立Cargo.toml
:[workspace]members = [ "library", "app",]
创立包:
- 对于
library
包:
mkdir librarycd librarycargo 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 appcd appcargo 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我的项目能够更轻松地治理多包的构建、测试和依赖关系,特地是对于大型或分解成多个组件的我的项目而言。