rust学习十四.2、工作空间(workspace)

news/2025/2/28 19:56:44/文章来源:https://www.cnblogs.com/lzfhope/p/18607806

和大部分语言一样,cargo也可以创建一个工作空间,以便可以包含多个二进制单元和库单元,从而构建较为复杂的工程。

构建这样一个空间空间主要依赖两个手段:Cargo.toml和单元之间的目录结构

从效果上看,rust的Cargo在工作空间上的管理和maven大体相似,但是还不如maven那么的人性化。

 

一、如何编写顶级Cargo.toml

我们先看看新版本的工作空间的规定:https://doc.rust-lang.org/cargo/reference/workspaces.html

翻译一下。

工作空间的关键点

  • 规定成员允许执行的命令
  • 所有成员共享一个Cargo.lock,看图1可以明白
  • 所有成员共享一个输出目录,看图1可以明白
  • 所有成员可以共享包元数据,这个通过定义workspace.package实现
  • patch,replace,profile.*只能在顶级toml(工作空间)toml中定义,成员的无效

虚拟工作空间

如果你的工作空间配置(toml)不包含package部分,那么者就是一个虚拟的工作空间。这种情况下,所有的成员的目录都是空间的子目录。

反之,就不是一个虚拟工作空间,也就是我们如果在顶级包中包含了根包(root package),那么就不是一个虚拟工作空间。

作为一个非虚拟空间,也就意味着可以在工作空间配置中定义package有关的一些配置,具体略。

到底要不要虚拟工作空间,纯看个人喜好。

个人倾向于构建一个虚拟的工作空间,因为这个和maven工程更像。

不能做的事情

如果你定义了一个虚拟的工作空间,那么就不能在工作空间配置文件中包含常规单元包所具有的一些配置,例如package,dependencies之类的。

否则编译通过不过

二、单元Cargo.toml

在一个工作空间中,可以有一个二进制包,若干个库单元包。

如果你执行cargo run,那么cargo会自动找到二进制包并运行。

二进制的配置和单独的一个二进制配置并没有什么区别,还有更多,主要是两点:

  • 共享工作空间的包配置(package),这个通过  xxx.workspace=true实现,这个xxx可以是name之外的一些包属性
  • 共享依赖,这也是工作空间的一个极其重要的目的,避免引入不同的外部单元包,导致版本冲突。这个通过dependencies中xxx.workspace=true实现

其它还包括受限的命令、编译工具(lint)、外部工具元数据。

库单元配置同二进制单元配置,具体略

三、其它

工作空间所涉及的,不止本文提到的一些内容,完整的请参考 https://doc.rust-lang.org/cargo/reference/workspaces.html

四、例子

本文模仿了有关例子,并结合https://doc.rust-lang.org/cargo/reference/workspaces.html的内容,实现了一个简单的工作空间。

4.1、概述

整个空间包含一个二进制库wsmain,以及两个库单元:teacher,student

整个目录结构如下:

图1_示例工作空间wsexample

 

4.2、配置

共有四个配置文件,一个是工作空间的,三个是单元包的。重点看三个:

1.wsexample

[workspace]
members = [
    "student","teacher", "wsmain",
]
resolver = "2"
[workspace.package]
version = "0.1.0"
edition = "2021"
[workspace.dependencies]
rand = "0.9.0-beta.1" 

 

这个配置为所有的成员限定了包的发行版本和版本,并指定了共享的依赖rand。

2.wsmain

[package]
name = "wsmain"
version.workspace=true
edition.workspace=true[dependencies]
student={path="../student"}
teacher={path="../teacher"}

这个配置指定了wsmain依赖的两个库包,并且包部分共享了工作的包配置(version,edition)

 

对工作空间内其它库单元依赖的定义是让我失望的地方,不够优雅,个人建议这样:

member.student=true

teacher.sutdent=true

 

3.student

[package]
name = "student"
version.workspace=true
edition.workspace=true
[dependencies]
rand.workspace=true

 

这个配置指定了student共享了工作空间的包配置,并指定了共享工作空间的依赖rand

 

4.3、代码

二进制单元main.rs代码

use teacher::*;
use student::*;fn main() {let lml=studentinfo{name:String::from("lml"),age:18,gender:String::from(""),no:String::from("12101")};print_student(&lml);lml.learn();lml.sleep();let lu=teacherinfo{name:String::from("lu"),age:46,gender:String::from(""),position:String::from("教研组长"),};lu.teach_student(&lml);print_teacher(&lu);
}

 

 

4.4、运行

在一个虚拟工作空间内,无需指定包名,即可运行,例如

cargo run

 如果硬要指定也可以,通过参数-p来指定包名,或者--package,例如:

cargo run -p wsmain

结果同cargo run 一样,具体略。

 

五、小结

  1. 运用cargo也可以构建一个工作空间,以便包含一个二进制单元和多个库单元
  2. 在效果上,cargo的构建过程和效果类似maven,但某些方面不如maven来得优雅
  3. 本文所提到的知识,已经足以解决工厂常见问题:模块化、共享(配置和依赖)
  4. 更到的高级特性,包括编译,发布等等需要阅读更多相关资料

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/853190.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

08一些元素的使用

一、今日学习内容 1、HTML常见的元素 HTML结构分析,H1到6,p元素,img,a元素,div,span元素 不常用元素,HTML全局属性 2、额外知识点补充 字符实体,URL地址,元素语义化,SEO优化,字符编码tip:这样在编写代码的时候就不用频繁的切换到英文状态下了 这样会提高编写代码的…

零基础科研小白の服务器看这个就够了

服务器 我们上网的时候经常会遇到连不上服务器,那啥是服务器呢。 其实就是一些特化的计算机,是远处有物理实体的设备。 from 挑战全网最硬核服务器基础知识 什么是服务器? 有 高计算 能力,能够通过网络 提供多种服务 的计算机。 服务器啥模样?服务器有什么特点? 计算能力…

2024-2025-1 20241415 《计算机基础与程序设计》第十二周学习总结

2024-2025-1 20241415《计算机基础与程序设计》第十二周学习总结 作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计这个作业要求在哪里 2024-2025-1计算机基础与程序设计第十二周作业这个作业的目标 复习巩固前面所学的内容作业正文 https://www.cnblogs.com/zh…

Python序列的应用(九):集合以及列表、元组、字典和集合的区别

前言: 一、集合 Python 中的集合同数学中的集合概念类似,也是用于保存不重复元素的。它有可变集合(set)和不可变集合(fozenset)两种。本节所要介绍的可变集合是无序可变序列,而不可变集合在本书中不做介绍。在形式上,集合的所有元素都放在一对{}中,两个相邻元素间使用,分…

jQuery鼠标拖动旋转DOM元素插件

Propeller.js是一款jQuery鼠标拖动旋转DOM元素插件。通过该插件,可以使用鼠标拖动旋转页面中的任意DOM元素。使用方法 通过npm安装插件。npm install Propeller HTML结构 例如要拖动旋转一张图片。<img src="demo.jpg" id="img"> 初始化插件 作为jq…

js消息通知框、对话框、确认框和Loading插件

Notiflix是一款js消息通知框、对话框、确认框和Loading插件。Notiflix通过简单的设置,就可生成非常漂亮的s消息通知框、对话框、确认框和Loading效果。在线预览 下载使用方法 在页面中引入下面的文件。<link rel="stylesheet" href="css/notiflix-1.3.0.mi…

人工智能大语言模型起源篇,低秩微调(LoRA)

上一篇: 《规模法则(Scaling Law)与参数效率的提高》 序言:您在找工作时会不会经常听到LoRA微调,这项技术的来源就是这里了。 (12)Hu、Shen、Wallis、Allen-Zhu、Li、L Wang、S Wang 和 Chen 于2021年发表的《LoRA: Low-Rank Adaptation of Large Language Models》,htt…

群晖Lets Encrypt证书申请

注意本文时效性:2024.9.23 引言 为了保证SSL证书的权威性和安全性,Lets Encrypt 会验证您对域名的控制权。 申请 Lets Encrypt 证书有以下的验证控制权的方式:Web验证:通过在http的有权威的目录下创建一个验证文件以验证对服务器的控制权 Dns验证:通过在 DNS Record 中添加…

《计算机基础与程序设计》第十二周学习总结

学期(如2024-2025-1) 学号(如:20241300) 《计算机基础与程序设计》第十二周学习总结 作业信息这个作业属于哪个课程 <班级的链接> 2024-2025-1-计算机基础与程序设计这个作业要求在哪里 <作业要求的链接> 2024-2025-1计算机基础与程序设计第十二周作业)这个作…

读数据保护:工作负载的可恢复性14备份和恢复数据库

备份和恢复数据库1. 给采用传统方式交付的数据库制作备份 1.1. 某个数据库是新还是旧,跟该数据库是不是传统数据库没有必然的联系,真正的决定因素在于,这个数据库是不是运行在你所管理的服务器或虚拟机里1.1.1. 如果是,那就可以归入按照传统模型来交付的数据库1.1.2. 如果不…

2024北京多校联训游记

乡下人进城——开了眼了Day \(-\infty\) NOIP考的十分炸裂,一道题都没做出来,结果下来 \(40min\) 就切掉了第 \(2\) 题???这时 \(hfu\) 通知有意向的同学可以去参加在北京的多校联训。经过一番思想斗争后,还是决定去参加一下,毕竟技多不压身,且基础知识也整理的差不多了…

[CSP2020-J4] 直播获奖

题面 题目描述 NOI2130 即将举行。为了增加观赏性,CCF 决定逐一评出每个选手的成绩,并直播即时的获奖分数线。本次竞赛的获奖率为 $w%$,即当前排名前 $w%$ 的选手的最低成绩就是即时的分数线。 更具体地,若当前已评出了 $p$ 个选手的成绩,则当前计划获奖人数为 $\max(1, \…