Cargo工作空间¶
一、概述¶
cargo工作空间可以帮助管理多个相互关联且需要协同开发的crate。实际上,cargo工作空间是一套共享同一个Cargo.lock和输出文件夹的包。
二、创建工作空间¶
有多种方式创建工作空间,我们下面先创建一个二进制crate,再创建2个库crate。二进制crate包含main函数,依赖于其他2个库crate,其中1个库crate提供add_one函数,另一个库crate提供add_two函数。下面是具体的步骤
先创建一个add
目录,在该目录下创建一个Cargo.toml
文件,该文件用于配置整个包工作空间,如下内容
上面的代码中,包含wokspace
节点,在该节点下的members
字段表示工作空间的成员。现在我们使用cargo new adder
在工作空间下创建出adder
crate。
现在就创建出了一个工作空间,并且该空间内包含一个crate。在工作空间里使用cargo build
命令将会对整个工作空间进行编译,编译后在target
产生编译产物。即使我们切换到具体的crate目录执行cargo build
,编译产物也依然会生成在工作空间下的target
目录。通过共享一个target目录,不同的项目就可以避免不必要的重复编译过程。
三、工作空间内的二进制crate依赖库crate¶
现在我们在工作空间下的Cargo.toml
文件添加add-one
项目,该项目是个库crate,所以使用cargo new add-one --lib
创建出来。我门修改add-one
项目的src/lib.rs
代码,修改为如下内容
接下来我们让adder
项目依赖add-one
这个项目,在adder
项目中修改Cargo.toml
文件,追加以下内容即可
最后修改adder
项目的src/main.rs
源代码,如下
use add_one;
fn main() {
let num = 10;
println!(
"Hello, world! {} plus one is {}!",
num,
add_one::add_one(num)
)
}
这时候我们要运行adder
这个项目,需要在工作空间内使用-p
参数指定项目名即可,如下命令
四、在工作空间中依赖外部的crate¶
工作空间只有一个Cargo.lock文件,在工作空间的顶层目录。这个文件的配置内容保证里工作空间内所有的crate使用的依赖的版本都相同。下面我们做一个测试
我们先在add-one
项目的Cargo.toml
添加以下定义
我们在adder
项目的Cargo.toml
添加以下定义
但是我们在工作空间执行cargo build
之后,通过分析Cargo.lock
文件,发现两个crate使用的是同一个版本,并覆盖了Cargo.toml
中定义的版本。这样工作空间内所有的crate相互兼容。
我们再通过cargo new add-two --lib
创建add-two项目,并在工作空间里引入,如果这时候我门直接在add-two项目里使用rand
crate是不行的,编译会报错,需要在其Cargo.toml
先声明才可以。
五、为工作空间添加测试¶
当我们在工作空间运行cargo test
时,cargo会一次性运行工作空间里的所有crate的测试代码,包括文档注释的测试。如果只需要测试某个crate,使用-p
参数指定具体crate即可,如下示例命令
对于发布,没有提供一次性发布工作空间所有crate的功能,如果需要发布,我门必须手动切换到具体的crate目录,再执行cargo publish
。