首页 > 其他分享 >【Rust自学】14.5. cargo工作空间(Workspace)

【Rust自学】14.5. cargo工作空间(Workspace)

时间:2025-01-23 16:29:57浏览次数:3  
标签:14.5 cargo workspace Cargo crate add adder Workspace

喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(=・ω・=)
请添加图片描述

14.4.1. 为什么需要cargo workspace

假如说我们构建了一个二进制crate,里面既有library又有库。随着项目规模不断增长,库crate可能不断变大。在这种情况下通常会把它拆为多个包,针对这种需求,Rust提供了cargo工作空间,也就是cargo workspace。

cargo workspace会帮助管理多个相互关联且需要协同开发的crate。其本质是一套共享同一个Cargo.lock和输出文件的包。

14.4.2. 使用workspace

有多种方式可以创建工作空间(workspace)。

做一个例子,这个工作空间里有1个二进制crate和1个库crate:

  • 二进制crate里有main函数,依赖于库crate
  • 其中一个库crate提供一个叫add_one函数

1. 创建workspace目录

首先为工作空间创建一个目录,我取名叫add,在终端输入:

$ mkdir add
$ cd add

2. 在主项目中使用workspace

接下来,在add目录中,我们创建将配置整个工作区的Cargo.toml文件。该文件不会有[package]部分。相反,它将以[workspace]部分开头:

[workspace]

members = [
    "adder",
]

adder就是我给二进制crate取的名,这个列表可以继续添加。

3. 添加库

$ cargo new adder

通过这个命令创建了adder crate,在目录add/adder

此时整个项目的结构如下:

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

需要注意的是,这时候我们既可以对add这个项目使用cargo build,也可以对add下的adder库使用cargo bulid。但是生成的target目录和Cargo.lock文件只会有一个,在add目录下,而adder库使用cargo bulid的产出物也会存放在这里。因为各个crate往往是相互依赖的,每个目录都有自己的target就会导致开发者不得不反复编译工作空间里的其余crate。

接下来添加其它crate:

另一个crate叫add_one,修改工作空间信息:

[workspace]

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

使用cargo new添加库,记得使用--lib旗帜来把它声明为library crate:

$ cargo new add_one --lib

现在整个项目的结构是:

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

4. 编写代码

add_one/src/lib.rs文件中,我们添加一个add_one函数:

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

现在我们可以让adder包和我们的二进制文件依赖于add_one。首先,我们需要添加路径依赖add_oneadder/Cargo.toml,因为Cargo并不假设工作区中的crate会相互依赖,因此我们需要明确依赖关系。在adder/Cargo.toml中这么写:

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

接下来,让我们使用add_one函数(来自add_one crate)。打开adder/src/main.rs文件并在顶部添加use来把add_one引入作用域,将新的add_one库crate纳入范围。然后更改main函数来调用add_one函数。

use add_one;

fn main() {
    let num = 10;
    println!("Hello, world! {num} plus one is {}!", add_one::add_one(num));
}

5. 编译

add这个项目使用cargo build

$ cargo build
   Compiling add_one v0.1.0 (file:///projects/add/add_one)
   Compiling adder v0.1.0 (file:///projects/add/adder)
    Finished dev [unoptimized + debuginfo] target(s) in 0.68s

没有报错,正常运行。

6. 测试

我们还可以通过使用-p标志并指定我们要测试的包的名称,从顶级目录中对工作区中的一个特定包运行测试。比如说仅测试add_one函数:

$ cargo test -p add_one
    Finished test [unoptimized + debuginfo] target(s) in 0.00s
     Running unittests src/lib.rs (target/debug/deps/add_one-b3235fea9a156f74)

running 1 test
test tests::it_works ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

   Doc-tests add_one

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

如果您将工作区中的 crate 发布到crates.io ,则工作区中的每个 crate 都需要单独发布。与cargo test一样,我们可以使用-p在工作区中发布特定的箱子标记并指定我们要发布的包的名称。

标签:14.5,cargo,workspace,Cargo,crate,add,adder,Workspace
From: https://blog.csdn.net/weixin_71793197/article/details/145319519

相关文章

  • 250103.openEuler欧拉安装Jenkins并修改构建workspace路径
    1.安装Jenkinswget-O/etc/yum.repos.d/jenkins.repohttps://pkg.jenkins.io/redhat-stable/jenkins.repo--no-check-certificaterpm--importhttps://pkg.jenkins.io/redhat-stable/jenkins.io-2023.keyyuminstall-yfontconfigjava-17-openjdkdnf-yinstalljenk......
  • yarn install 安装报错:Workspaces can only be enabled in private projects.
    在本地运行项目的时候,使用yarninstall安装模块依赖的时候,遇到报错:Workspacescanonlybeenabledinprivateprojects.一、原因分析报这个错误是因为你使用了yarn的workspace,但并未将工程标记为private。二、解决办法在项目根目录中的package.json文件中添加p......
  • Multi Commander(多标签文件管理器) v14.5.0.3054
    MultiCommander中文版是一个多标签文件管理器,是一个标准的Windows资源管理器的替代软件,该最大的特色是带有双面板、并且还可以启用标签页形式浏览,在界面底部还带各种常见的功能按钮。软件功能1、集成多种常用功能的底部按钮面板:第一行的功能包括了刷新、查看、编辑、拷......
  • Cargo.toml -- 学习rust项目管理的尖刀
    Cargo.toml是Rust项目管理中的核心文件,包含了项目的元数据、依赖项、构建配置等关键信息文档地址:https://doc.rust-lang.org/cargo/reference/manifest.html每个toml文件均由以下部分组成:-cargo-features—不稳定,仅限夜间功能。-[package]—定义一个包。--name—包的名称......
  • cargo 工具的使用详解 ---从cargo开始规范代码
    cago命令参数cargo--listInstalledCommands:addAdddependenciestoaCargo.tomlmanifestfilebalias:buildbenchExecuteallbenchmarksofalocalpackagebuildCompilea......
  • 掌握pnpm Workspace秘诀:轻松管理多个Vue项目,告别混乱!
    个人使用背景:公司多个后台系统想共用同一套ui框架和组件共用,方便使用组件库二次封装的内容,已经一些共用的api,所以使用workspace官方文档:pnpm内置了对单一存储库(也称为多包存储库、多项目存储库或单体存储库)的支持。你可以创建一个工作空间以将多个项目合并到一个仓库中。......
  • rust学习十四.2、工作空间(workspace)
    和大部分语言一样,cargo也可以创建一个工作空间,以便可以包含多个二进制单元和库单元,从而构建较为复杂的工程。构建这样一个空间空间主要依赖两个手段:Cargo.toml和单元之间的目录结构从效果上看,rust的Cargo在工作空间上的管理和maven大体相似,但是还不如maven那么的人性化。 一......
  • Cargo 教程
    在Rust开发中,几乎所有的项目都是使用Cargo来进行管理和构建的,因为它提供了便捷的工作流程和强大的功能,使得Rust开发变得更加高效和可靠。Cargo是什么Cargo是Rust的官方构建系统和包管理器。它主要有两个作用:主要有两个作用:项目管理:Cargo用于创建、构建和管理R......
  • Rustup-init.exe安装后执行cargo run 报错:`link.exe` returned an unexpected error的
    版本:rustc1.81.0(eeb90cda12024-09-04)报错情况如下图:摸索了后,总结一下关键解决方法:从微软件官网:https://visualstudio.microsoft.com/zh-hans/downloads/找到选项“用于VisualStudio的工具”,在其子项中下载“VisualStudio2022生成工具”下载后安装时,在Visualstu......
  • 挂载 /mnt/disk2 改成 /home/shgbitai/dataworkspace 怎么修改
    你可以按照以下步骤将挂载点/mnt/disk2修改为/home/shgbitai/dataworkspace:1.创建新的挂载点首先,创建新的挂载目录/home/shgbitai/dataworkspace:sudomkdir-p/home/shgbitai/dataworkspace2.取消挂载旧的挂载点取消当前挂载到/mnt/disk2的分区:sudoumount......