20.Cargo和Crates.io

标题

  • 一、采用发布配置自定义构建
    • 1.1 默认配置
    • 1.2 修改配置项
  • 二、将crate发布到Crates.io
    • 2.1 编写文档注释
    • 2.2 常用(文档注释)部分
    • 2.3 文档注释作用测试
    • 2.4 为包含注释的项添加文档注释
    • 2.5 使用pub use导出公有API
    • 2.6 创建Crates.io账号
    • 2.7 发布
    • 2.8 版本撤回
  • 三、Cargo工作空间
    • 3.1 创建工作空间
    • 3.2 在工作空间中依赖外部crate
    • 3.3 为工作空间增加测试
  • 四、其它
    • 4.1 从Crates.io安装二进制文件
    • 4.2 自定义扩展命令

一、采用发布配置自定义构建

1.1 默认配置

  • 可以通过**发布配置(release profiles)**定制带有不同选项的配置,且每个配置都彼此相互独立;
  • Cargo有两个主要配置:运行cargo build时采用的dev配置和cargo build --release的release配置(如下图);
  • dev配置是开发时的默认配置,release配置则是发布构建的默认配置;

在这里插入图片描述

1.2 修改配置项

  • Cargo.toml可以通过[profile.*]对应项中修改默认值;
[profile.dev]
opt-level = 0[profile.release]
opt-level = 3
  • opt-level控制编译器对源码的优化程序,其值域为[0,3],越高的优化级别需要更多的时间编译;
  • dev的默认级别为0,release的默认级别为3;
  • 更多的相关配置项请参阅文档;

二、将crate发布到Crates.io

  • 可以通过发布包来共享自己的代码;
  • crate的注册表在https://crates.io,它托管代码并分发已经注册的包的源代码;

2.1 编写文档注释

  • 文档注释可以直接生成HTML文档;
  • 文档注释使用三斜杠注释;
  • 文档注释支持使用Markdown语法;
  • 文档注释位于被说明条目之前;

以下面的代码采用文档注释 (放于lib.rs中)

/// Adds one to the number given.
///
/// # Examples
///
/// ```
/// let arg = 5;
/// let answer = minigrep::add_one(arg);
///
/// assert_eq!(6, answer);
/// ```
pub fn add_one(x: i32) -> i32 {x + 1
}
  • 使用命令cargo doc --open会构建当前文档以及所有crate依赖的文档并在浏览器中打开;
  • 生成的文档会存在到本地的target/doc目录下;

在这里插入图片描述

  • 点击add_one就可以看到编写的注释,里面显示的Markdown注释的部分

在这里插入图片描述

2.2 常用(文档注释)部分

# Examples是Markdown中创建了标题部分,其他在文档注释中常见的还有

  • Panic:函数可能会panic! 的场景;
  • Errors:如果这个函数返回 Result,此部分描述可能会出现何种错误以及什么情况会造成这些错误;
  • Safety:如果这个函数使用unsafe 代码,就该解决函数unsafe的原因,以及调用者确保的使用前提;

2.3 文档注释作用测试

cargo test也能运行文档中的示例代码

  • 运行命令cargo test会看到Doc-tests的运行结果。

在这里插入图片描述

2.4 为包含注释的项添加文档注释

  • 使用//!外层条目添加注释;
  • 通常用于crate根文件(通常是src/lib.rs)或模块的根文件,为create或模块整体提供文档;
  • 在刚刚的文件最上边添加下面几行;
//! # minigrep Crate
//!
//! `minigrep` is a collection of utilities to make performing certain
//! calculations more convenient.
  • 然后执行cargo doc --open,可以看到网页有了变化;

在这里插入图片描述

2.5 使用pub use导出公有API

前面说明了

  • 使用mod关键字将代码组织到模块中;
  • 使用pub关键字将项变为公有;
  • 使用use关键字将项引入作用域;

问题

  • crate的程序结构在开发时方便,在它的使用者使用时不方便(比如层数过深)
  • 诸如my_crate::some_module::another_module::UsefulType;而不是use my_crate::UsefulType;

解决方案

  • 使用pub use进行重导出(re-export)项;
  • 重导出获取位于一个位置的公有项并将其公开到另一个位置;

举例

下面描述了描述美术信息的art库
src/lib.rs

//! # Art
//!
//! A library for modeling artistic concepts.pub mod kinds {/// The primary colors according to the RYB color model.pub enum PrimaryColor {Red,Yellow,Blue,}/// The secondary colors according to the RYB color model.pub enum SecondaryColor {Orange,Green,Purple,}
}pub mod utils {use crate::kinds::*;/// Combines two primary colors in equal amounts to create/// a secondary color.pub fn mix(c1: PrimaryColor, c2: PrimaryColor) -> SecondaryColor {SecondaryColor::Orange}
}

main.rs

use art::kinds::PrimaryColor;
use art::utils::mix;fn main() {let red = PrimaryColor::Red;let yellow = PrimaryColor::Yellow;mix(red, yellow);
}

问题

  • 查看它的文档首页中,枚举类型并没有出现,必须要点击下面的kinds才会显示;

在这里插入图片描述

  • main.rs中依赖这个库的crate需要use语句来导入art中的项;
  • 使用者必须知道PrimaryColormix的具体位置才能导入,而具体位置对使用者来说是没有意义的;

解决方案

  • src/lib.rs中的最上面增加pub use语句来重导出到顶层结构
//! # Art
//!
//! A library for modeling artistic concepts.pub use self::utils::mix;
pub use self::kinds::PrimaryColor;
pub use self::kinds::SecondaryColor;
  • 如此一来,对于main.rs的使用也可以改为
// use art::kinds::PrimaryColor;
// use art::utils::mix;use art::PrimaryColor;
use art::mix;
  • 重新生成一下文档,可以看到枚举类型出现在了主页;

在这里插入图片描述

2.6 创建Crates.io账号

  • 在crates.io上注册账号并获取一个API token;
  • 网站需要用Github账户登录;
  • 登录成功后进入Account Settings页面;
    在这里插入图片描述
  • 选择左边的API Tokens,然后选择New Token

在这里插入图片描述

  • 填入信息后单击"Generate Token“

在这里插入图片描述

  • 然后复制这一串生成的token;
    在这里插入图片描述
  • 使用cargo login 复制的token将token存储在本地;

注意:前面如果换了源则这里可能不成功,需要先将之前的文件换个名称或删除 (文件位置:C:\Users\xxx.cargo\config.toml) ,下面就是删除前后的登录结果;
在这里插入图片描述

2.7 发布

  • 在发布新crate之前需要在Cargo.toml文件的[package]中添加一些元信息;
[package]
name = "唯一的名称"
version = "0.1.0"
authors = ["Your Name <you@example.com>"]
edition = "2018"
description = "一句话描述"
license = "MIT OR Apache-2.0" 
  • 使用cargo publish命令发布,根据错误信息修改;
  • 一旦发布就是永久性的,版本无法覆盖,代码无法删除;
  • 要重新发布则修改Cargo.toml中version的值,再重新发布;

2.8 版本撤回

  • 撤回功能并不会删除任何代码;
  • 使用cargo yank可以撤回需要的版本,如cargo yank --vers 1.0.1
  • 也可以取消撤回,如cargo yank --vers 1.0.1 --undo
  • 是为了防止新项目依赖于该版本;
  • 已经存在的项目可继续将其作为依赖并可下载;

三、Cargo工作空间

  • 工作空间的作用是帮助管理多个相互关联且需要协同开发的crate;
  • cargo工作空间是一套共享同一个Cargo.lock和输出文件夹的包;

3.1 创建工作空间

当前的工作空间中有一个二进制和两个库crate;

  1. 创建文件夹add并进入;
  2. 在add目录中创建Cargo.toml文件,它以[workspace]部分作为开始;
  3. 假设要加入一个二进制crate,其名称为adder,则Cargo.toml的内容为
[workspace]
members = ["adder",
]
  1. 然后在add目录下执行cargo new adder命令,则最终的目录结构如下
    在这里插入图片描述
  2. 现在可以在add目录下使用cargo build构建工作空间;
  3. 再新建一个库crate,名称为add-one, 则Cargo.toml的内容变为
[workspace]
members = ["adder","add-one",
]
  1. 再在add目录下执行cargo new add-one --lib命令创建,此时目录结构变为
    在这里插入图片描述
  2. add-one/src/lib.rs的内容变为
pub fn add_one(x: i32) -> i32 {x + 1
}
  1. 让adder依赖于库add-one,需要在adder/Cargo.toml文件中添加依赖路径;
[dependencies]
add-one = {path = "../add-one"}
  1. 要在adder中使用add-one中的add_one函数,则将adder/src/main.rs文件修改为
use add_one;fn main() {let num = 10;println!("Hello, world! {} plus one is {}!", num, add_one::add_one(num));
}
  1. 然后使用cargo build可以正确的构建工作空间;
  2. 在顶层add目录运行二进制crate,需要通过-p加包名称来运行,cargo run -p adder
    在这里插入图片描述

3.2 在工作空间中依赖外部crate

  • 工作空间只有根目录有一个Cargo.lock;
  • 不同的crate中添加同一个包的不同版本,会被最终解析成同一版本并记录到Cargo.lock中;
  • 不同crate要使用同一个包,必须在当前crate中的Cargo.toml中声明;

3.3 为工作空间增加测试

  • 为add_one函数增加测试
#[cfg(test)]
mod tests {use super::*;#[test]fn it_works() {assert_eq!(3, add_one(2));}
}
  • 在顶级add目录中运行cargo test会运行工作空间中所有crate的测试;
    在这里插入图片描述
  • 可以在根目录使用-p参数指定crate名称
    在这里插入图片描述
  • 如果发布工作空间中的crate,则工作空间中的每一个crate都要单独发布;
  • 因此必须进入每一个crate目录并运行cargo publish发布每一个crate;

四、其它

4.1 从Crates.io安装二进制文件

  • cargo install用于在本地安装和使用二进制crate
  • 所有安装的文件都放到安装根目录的bin文件夹$HOME/.cargo/bin中;
  • 如安装搜索文件的grep的Rust实现
cargo install ripgrep

4.2 自定义扩展命令

  • cargo可以使用子命令扩展;
  • 如果某个二进制是cargo-sth,则可以cargo sth运行;
  • 使用cargo --list列出所有自定义命令;
  • 这样就可以使用cargo install安装扩展,像内置工具一样运行;

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

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

相关文章

基于STM32的智能停车场管理系统

目录 引言环境准备智能停车场管理系统基础代码实现&#xff1a;实现智能停车场管理系统 4.1 车位检测模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景&#xff1a;智能停车场管理与优化问题解决方案与优化收尾与总结 1. 引言 智能停车场管理系统通…

Linux常用命令(17)—pastesortcomm命令(有相关截图)

写在前面&#xff1a; 最近在学习Linux命令&#xff0c;记录一下学习Linux常用命令的过程&#xff0c;方便以后复习。仅供参考&#xff0c;若有不当的地方&#xff0c;恳请指正。如果对你有帮助&#xff0c;欢迎点赞&#xff0c;关注&#xff0c;收藏&#xff0c;评论&#xf…

仿中波本振电路的LC振荡器电路实验

手里正好有一套中波收音机套件的中周。用它来测试一下LC振荡器&#xff0c;电路如下&#xff1a; 用的是两只中频放大的中周&#xff0c;初步测试是用的中周自带的瓷管电容&#xff0c;他们应该都是谐振在465k附近。后续测试再更换电容测试。 静态电流&#xff0c;0.5到1mA。下…

malloc和new的本质区别

目录 一、结论 二、示例 1.实现类T 2.用malloc分配类T的内存空间 3.用new分配类T的内存空间 一、结论 malloc 和 new 都是用于在运行时动态分配内存的机制。但它们之间存在一些本质的区别&#xff0c;主要是在使用方面&#xff0c;现在我们直接说结论&#xff0c;然后在通过…

ArcGIS与Excel分区汇总统计三调各地类面积!数据透视表与汇总统计!

​ 点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 点击学习——>遥感影像综合处理4大遥感软件ArcGISENVIErdaseCognition 01 需求说明 介绍一下ArcGIS与Excel统计分区各地类的三调地类面积。 ArcGIS统计分析不会&#x…

Unity客户端的Http通讯实战

背景知识 在Unity游戏开发中&#xff0c;一个常见场景是&#xff0c;后端扔过来一个Swagger后端接口网页&#xff0c;需要你使用对应的接口对应的接口发送和接收数据&#xff0c;如图所示为发起Get请求&#xff1a; 我们可以通过点击Try it out按钮直接在网页上测试收发数据&a…

spring整合openAI大模型之Spring AI

文章目录 一、SpringAI简介1.什么是SpringAI2.SpringAI支持的大模型类型&#xff08;1&#xff09;聊天模型&#xff08;2&#xff09;文本到图像模型&#xff08;3&#xff09;转录&#xff08;音频到文本&#xff09;模型&#xff08;4&#xff09;嵌入模型&#xff08;5&…

Guava-EventBus 源码解析

EventBus 采用发布订阅者模式的实现方式&#xff0c;它实现了泛化的注册方法以及泛化的方法调用,另外还考虑到了多线程的问题,对多线程使用时做了一些优化&#xff0c;观察者模式都比较熟悉&#xff0c;这里会简单介绍一下&#xff0c;重点介绍的是如何泛化的进行方法的注册以及…

dial tcp 10.96.0.1:443: connect: no route to host

1、创建Pod一直不成功&#xff0c;执行kubectl describe pod runtime-java-c8b465b98-47m82 查看报错 Warning FailedCreatePodSandBox 2m17s kubelet Failed to create pod sandbox: rpc error: code Unknown desc failed to setup network for…

数据挖掘与分析——数据预处理

数据探索 波士顿房价数据集&#xff1a;卡内基梅隆大学收集&#xff0c;StatLib库&#xff0c;1978年&#xff0c;涵盖了麻省波士顿的506个不同郊区的房屋数据。 一共含有506条数据。每条数据14个字段&#xff0c;包含13个属性&#xff0c;和一个房价的平均值。 数据读取方法…

昨天gitee网站访问不了,开始以为电脑哪里有问题了

昨天gitee网站下午访问不了&#xff0c;开始以为是什么毛病。 结果同样的网络&#xff0c;手机是可以访问的。 当然就ping www.gitee.com 结果也下面那样是正常的 以为是好的&#xff0c;但就是访问www.gitee.com也是不行&#xff0c;后来用阿里云的服务器curl访问是下面情况&…

LabVIEW机器视觉在质量控制中的应用

基于LabVIEW的机器视觉系统在质量控制中应用广泛&#xff0c;通过图像采集、处理和分析&#xff0c;自动检测产品缺陷、测量尺寸和识别标记&#xff0c;提高生产效率和产品质量。下面介绍LabVIEW机器视觉系统在质量控制中的实现方法、应用场景及其优势。 项目背景 在现代制造业…

github连接报本地

一、创建GIthub账号 这里默认大家已经创建好了并且有加速器&#xff0c;能正常上网&#xff0c;然后才能进行下面的操作。 二、创建ssh公钥 网址&#xff1a;Sign in to GitHub GitHub Sign in to GitHub GitHub 进入下面的界面&#xff1a; 然后创建新的密钥 三、官方文…

MCT Self-Refine:创新集成蒙特卡洛树搜索 (MCTS)提高复杂数学推理任务的性能,超GPT4,使用 LLaMa-3 8B 进行自我优化

&#x1f4dc; 文献卡 题目&#xff1a; Accessing GPT-4 level Mathematical Olympiad Solutions via Monte Carlo Tree Self-refine with LLaMa-3 8B作者: Di Zhang; Xiaoshui Huang; Dongzhan Zhou; Yuqiang Li; Wanli OuyangDOI: 10.48550/arXiv.2406.07394摘要: This pape…

kettle无法启动问题_PENTAHO_JAVA_HOME

1&#xff0c;遇到spoon.bat启动报错&#xff1a;先增加pause看清错误信息 1.1&#xff0c;错误信息 1.2&#xff0c;因为本地安装jdk1.6无法支持现有版本kettle。只能手动执行kettle调用的java路径&#xff1b;如下 系统--高级系统设置--高级--环境变量 启动成功

fastapi教程(一):初识 fastapi

FastAPI 是一个用于构建 API 的现代、快速&#xff08;高性能&#xff09;的 web 框架&#xff0c;使用 Python 并基于标准的 Python 类型提示。 关键特性: 快速&#xff1a;可与 NodeJS 和 Go 并肩的极高性能&#xff08;归功于 Starlette 和 Pydantic&#xff09;。最快的 …

甘肃旅游服务平台的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;公告信息管理&#xff0c;景点管理&#xff0c;酒店管理&#xff0c;基础数据管理&#xff0c;美食管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0…

HTML静态网页成品作业(HTML+CSS)——故宫介绍网页(4个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有4个页面。 二、作品演示 三、代…

Docker:安装RediSearch全文搜索

1、简述 在本文中&#xff0c;我们将介绍如何使用Docker快速、简便地安装RediSearch&#xff0c;Redis的全文搜索模块。RediSearch提供了高效的全文搜索功能&#xff0c;通过Docker安装&#xff0c;可以轻松地在任何环境中部署和管理RediSearch。 官网地址&#xff1a;https:/…

【GUI】LVGL无操作系统移植以及移植过程错误处理

目录 介绍 1. 删除源码 2. 导入lvgl到项目screen_mcu中 3. keil添加分组和头文件 4. 移植显示 5. 移植触摸 6. 添加测试案例 6.1. 测试按钮 6.2. 测试音乐界面 7. 提供时钟 错误处理 L6218E错误 出现花屏 屏幕颜色不对 内存分配 介绍 本文 主要介绍GD32移植…