工作空间

我们可以将一个包使用模块模块拆分组织代码结果,但是当项目的代码量达到一定规模后,整个项目结构仍然非常臃肿。 cargo提供了工作空间的功能,帮助开发者管理多个相互关联且需要协同开发的包。

工作空间是由公用一个Cargo.lock和输出目录的一系列包组成的。

创建工作空间

以一个实例来说明如果组织工作空间。工作空间中有一个二进制包和两个代码包,二进制包依赖另外两个代码包来实现自己的主要功能。

  1. 创建出工作空间的目录
mkdir add
cd add
  1. 创建一个Cargo.toml文件,再[workspace]区域下指定二进制包的路径。
[workspace]
members = [
	"adder",
]
  1. 使用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
}
  1. 让二进制包依赖代码包,从而使用代码包中的内容。在adder而不是add下的Cargo.toml下的[dependencies]区域添加路径依赖。因为工作目录的包不会自动彼此依赖。
[dependencies]
add-one = { path="../add-one" }
  1. 现在就可以在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));
}
  1. 使用cargo build构建工作空间,使用cargo run运行二进制程序。

工作空间只有其根目录下的唯一的Cargo.lock,这意味着工作空间中使用的所有外部包的版本都是兼容的。不过要注意的是,只有在对应成员下的cargo.toml引入了外部包,才能在这个包下使用这个外部包。

在工作空间根目录下运行cargo test会依次测试其每一个成员,使用-p参数可以指定要测试的包cargo test -p adder

工作空间中的包如果要发布,需要手动运行cargo publish发布每一个包,并没有提供发布所有包的功能。


tags: 项目管理 cargo