rust拾遗之workspace

提纲
1、为什么需要 workspace?
2、什么是 workspace?
3、如何应用 workspace?
4、扩展:依赖升级



1、为什么需要 workspace?

如果功能和逻辑都被构建在一个crate中,随着项目开发的深入,你可能会发现,crate越来越大,内部结构也越来越复杂。为了提高项目的可重用性,同时降低复杂度。你希望将此crate进一步拆分为多个crate。针对此种情况,Cargo.toml中提供了[workspace]配置。



2、什么是 workspace?

workspace,顾名思义是工作空间。在工作空间中存在多个crate,它们共享Cargo.lock和target输出目录。



3、如何应用 workspace?

我们通过一个简单的例子来了解如何应用workspace。示例中主要包含两个crate:可执行crate adder和library crate add_one。并在add_one crate中提供add_one函数供adder crate使用。

首先,创建文件夹add,并在其中添加Cargo.toml。

mkdir add
cd add 
touch Cargo.toml

然后,打开Cargo.toml并添加:

[workspace]
members = [
    "adder",
    "add_one"
]

成功保存后。执行cargo new adder构建可执行crate,并执行cargo new add_one --lib构建library crate。此时项目结构如下:

├── Cargo.lock
├── Cargo.toml
├── add_one
│   ├── Cargo.toml
│   └── src
│       └── lib.rs
├── adder
│   ├── Cargo.toml
│   └── src
│       └── main.rs
└── target

(如果未出现上述结构,执行cargo build后即可看到)

最后,打开add_one/src/ib.rs文件,添加如下函数:

pub fn add_one(x: i32) -> i32 {
    x + 1
}

同时,修改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 crate中添加add_one crate依赖,修改adder/Cargo.toml文件中[dependencies]部分为如下内容:

[dependencies]
add_one = { path = "../add_one" }

至此,所有需求编码完成。

运行cargo run -p adder后,即可看到

Hello, world! 10 plus one is 11!



4、扩展:依赖升级

使用workspace构建的多crate项目由于只会存在一个Cargo.lock,为了保证各crate的依赖兼容,需要进行依赖升级,规则如下:

(依赖版本的构成: 主版本号.次版本号.修订号)

主版本号为零时,主版本号和次版本号不变,修订号升级到最新版本
主版本号不为零时,主版本号不变,次版本号和修订号升级到最新版本

以clap为例

升级前 升级后
0.8.1 0.8.6
1.1.0 1.3.2


posted @ 2023-08-19 23:47  zhangzl419  阅读(487)  评论(0编辑  收藏  举报