20.Cargo和Crates.io

news2024/11/28 2:52:32

标题

  • 一、采用发布配置自定义构建
    • 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.coloradmin.cn/o/1851570.html

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

相关文章

若依框架集成微信支付

1. 添加微信支付相关依赖 <!-- 微信支付 --> <dependency><groupId>com.github.wxpay</groupId><artifactId>wxpay-sdk</artifactId><version>0.0.3</version> </dependency> <dependency><groupId>com.gi…

了解OpenEuler及安装OpenEuler实验环境

OpenEuler中国社区 OpenEuler操作系统介绍 OpenEuler是一款开源、免费的操作系统&#xff0c;由openEuler社区运作。当前openEuler内核源于Linux&#xff0c;支持鲲鹏及其它多种处理器&#xff0c;能够充分释放计算芯片的潜能&#xff0c;是由全球开源贡献者构建的高效、稳定、…

【启明智显产品分享】工业级HMI芯片——Model3,不止是速度,USB\CAN\8路串口

一、引言 Model3作为一款工业级HMI芯片&#xff0c;其性能卓越且功能全面。本文将从多个角度深入介绍Model3芯片&#xff0c;以展示其不仅仅是速度的代表。 二、Model3核心特性介绍 Model3工业级跨界MCU是一款国产自主的基于RISC-V架构的高性能芯片&#xff0c;内置平头哥E…

技巧:合并多个RAR分卷压缩

因为文件压缩之后体积仍然过大&#xff0c;大家可能会选择进行分卷压缩&#xff0c;那么rar分卷压缩包之后如何合并成一个压缩包文件呢&#xff1f;今天我们来学习rar分卷压缩包&#xff0c;合并成一个的方法。 最基础的方法就是将分卷压缩包解压出来之后&#xff0c;再将文件…

解锁PDF处理新境界:轻松调整字体,让你的文档焕然一新!

数字化时代&#xff0c;PDF文件已经成为我们日常办公和学习中不可或缺的一部分。它们为我们提供了方便的阅读体验&#xff0c;同时也保证了文档内容的完整性和格式的统一性。然而&#xff0c;有时候我们可能会遇到一个问题&#xff1a;如何轻松调整PDF文件中的字体&#xff0c;…

2024年能源电力行业CRM研究报告

中国能源电力行业属于大制造业的重要组成部分&#xff0c;在国民经济中的地位举足轻重。据统计&#xff0c;近十年来能源电力行业的整体投资呈现出增长趋势&#xff0c;尤其是“十四五”期间增长显著&#xff0c;2022年全国主要电力企业共完成投资12470亿元&#xff0c;同比增长…

炸裂!Claude 3.5 正式发布!超越 GPT-4o!

Anthropic 又憋了个大招&#xff01;推出了 Claude 3.5 Sonnet&#xff01;速度是 Claude 3 的两倍&#xff01;而且数学和编码能力已经超过了 GPT-4o&#xff01; 官方声称&#xff1a;这是我们迄今为止最智能的模型。 直接看测评图&#xff0c;很多指标都吊打 GPT-4o&#xf…

具有 Hudi、MinIO 和 HMS 的现代数据湖

Apache Hudi 已成为管理现代数据湖的领先开放表格式之一&#xff0c;直接在现代数据湖中提供核心仓库和数据库功能。这在很大程度上要归功于 Hudi 提供了表、事务、更新/删除、高级索引、流式摄取服务、数据聚类/压缩优化和并发控制等高级功能。 我们已经探讨了 MinIO 和 Hudi…

CentOS7在2024.6.30停止维护后,可替代的Linux操作系统

背景 Linux的发行版本可以大体分为两类&#xff0c;一类是商业公司维护的发行版本&#xff0c;一类是社区组织维护的发行版本&#xff0c;前者以著名的Redhat&#xff08;RHEL&#xff09;为代表&#xff0c;后者以Debian为代表。国内占有率最多的却是Centos&#xff0c;这是由…

long long ago

一、long 众所周知&#xff0c;英文单词 long&#xff0c;表示长,长的。 但是&#xff0c;还有很多你不知道到的东西&#xff0c;根据英文单词首字母象形原则&#xff0c;我们可以做一下单词long结构分析&#xff1a; long l长 ong长 什么意思&#xff1f;就是说首字线 l…

常用类小结

Java API概述 API(Application Programming Interface)应用程序编程接口 是对java预先定义的类或接口功能和函数功能的说明文档&#xff0c;目的是提供 给开发人员进行使用帮助说明 Object类 ● Object类是所有Java类的祖先&#xff08;根基类&#xff09;。每个类都使用 Ob…

全栈工程师工作干货总结(二)

1. linux允许ROOT登录ftp # 进入vsftpd目录 cd /etc/vsftpd# 查看该目录包含的文件 ls# 进入文件vsftpd.ftpusers&#xff0c;在root前加#注释root vi vsftpd.ftpusers# 进入文件vsftpd.user_list&#xff0c;在root前加#注释root vi vsftpd.user_list2. 关于只能IP访问&…

【网络安全学习】使用Kali做信息收集-02-<指纹识别目录扫描>

1.指纹识别 指纹识别是指通过一些特征或特定文件来识别目标网站或系统的类型、版本、组件等信息&#xff0c;以便寻找相应的漏洞或攻击方法。 主动指纹识别 通过向目标系统发送正常和异常的请求以及对文件内容的查找&#xff0c;记录响应方式&#xff0c;然后与指纹库进行对比…

C++进阶之AVL树

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 C进阶​ ​​​​算法 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂 目录 一.前言 二.插入 三.旋转 3.1右旋 …

代码随想录——分发饼干(Leetcode455)

题目链接 贪心 class Solution {public int findContentChildren(int[] g, int[] s) {Arrays.sort(g);Arrays.sort(s);int count 0;for(int i 0, j 0; i < g.length && j < s.length; i, j){if(s[j] > g[i]){count;}else{i--;}}return count;} }

通过InoDriverShop伺服调试软件连接汇川SV660F系列伺服的具体方法(以太网)

通过InoDriverShop伺服调试软件连接汇川SV660F系列伺服的具体方法(以太网) 具体连接伺服驱动器的步骤可参考以下内容: 启动InoDriverShop, 新建或打开工程 如下图所示,选择在线,选中SV660F图标,右侧通信类型选择“TCP—DCP”,点击下一步,同时要选择自己当前使用的网卡…

棉花叶子病害分类数据集3601张6类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;3601 分类类别数&#xff1a;6 类别名称:[“aphids”,“army_worm”,“bact…

SpringBoot + Vue 实现 AES 加密和 AES 工具类总结

目录 一、加密知识回顾 AES加密模式 二、Java 自定义 AES 工具类 三、SpringBoot 实现 AES 加密登陆 controller 层 server 层 四、Vue 实现 AES 加密登陆 五、前端AES工具类 六、实现结果 一、加密知识回顾 密钥是AES算法实现加密和解密的根本。对称加密算法之所以…

JDK17特性

JDK17特性 一、JAVA17概述 JDK 16 刚发布半年(2021/03/16),JDK 17 又如期而至(2021/09/14),这个时间点特殊,蹭苹果发布会的热度?记得当年 JDK 15 的发布也是同天。 Oracle 宣布,从 JDK 17 开始,后面的 JDK 带附加条款免费提供!!!Java 17+ 可以免费使用了,包括商…

当Windows台式电脑或笔记本电脑随机关机时,请先从这8个方面检查

序言 你的Windows笔记本电脑或PC是否意外关闭?笔记本电脑电池故障、电源线松动、过热、电源设置错误、驱动程序过时或电脑组件故障等问题都可能是罪魁祸首。如果你对这个问题感到沮丧,试试这些解决方案。 进行一些初步检查 与从电池中获取电力的笔记本电脑不同,台式电脑依…