工作空间
我们可以将一个包使用模块于模块拆分组织代码结果,但是当项目的代码量达到一定规模后,整个项目结构仍然非常臃肿。 cargo提供了工作空间的功能,帮助开发者管理多个相互关联且需要协同开发的包。
工作空间是由公用一个Cargo.lock和输出目录的一系列包组成的。
创建工作空间
以一个实例来说明如果组织工作空间。工作空间中有一个二进制包和两个代码包,二进制包依赖另外两个代码包来实现自己的主要功能。
- 创建出工作空间的目录
mkdir add
cd add- 创建一个Cargo.toml文件,再
[workspace]区域下指定二进制包的路径。
[workspace]
members = [
"adder",
]- 使用cargo new命令在add目录下创建adder二进制包
cargo new adder然后使用cargo build就可以构建整个工作空间了,在工作空间目录下的target目录用来存放所有成员的编译产出物,其成员没有了自己独立的target。 4. 在工作空间新增一个成员
[workspace]
members = [
"adder",
"add-one",
]然后使用cargo new —lib创建新的代码包。在src/lib.rs下编写如下函数
pub fn add_one(x: i32) -> i32 {
x + 1
}- 让二进制包依赖代码包,从而使用代码包中的内容。在adder而不是add下的Cargo.toml下的
[dependencies]区域添加路径依赖。因为工作目录的包不会自动彼此依赖。
[dependencies]
add-one = { path="../add-one" }- 现在就可以在adder包中使用use导入add-one包后,就可以使用add-one包的内容了。
use add_one;
fn main() {
let num = 10;
println!("Hello, world! {} plus one is {}", num, add_one::add_one(num));
}- 使用cargo build构建工作空间,使用cargo run运行二进制程序。
工作空间只有其根目录下的唯一的Cargo.lock,这意味着工作空间中使用的所有外部包的版本都是兼容的。不过要注意的是,只有在对应成员下的cargo.toml引入了外部包,才能在这个包下使用这个外部包。
在工作空间根目录下运行cargo test会依次测试其每一个成员,使用-p参数可以指定要测试的包cargo test -p adder。
工作空间中的包如果要发布,需要手动运行cargo publish发布每一个包,并没有提供发布所有包的功能。