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安装扩展,像内置工具一样运行;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于STM8系列单片机驱动LCD12864液晶程序

1&#xff09;单片机/ARM硬件设计小知识&#xff0c;分享给将要学习或者正在学习单片机/ARM开发的同学。 2&#xff09;内容属于原创&#xff0c;若转载&#xff0c;请说明出处。 3&#xff09;提供相关问题有偿答疑和支持。 LCD12864支持串行和并行的通信传输方式&#xff…

NeRF从入门到放弃3: EmerNeRF

https://github.com/NVlabs/EmerNeRF 该方法是Nvidia提出的&#xff0c;其亮点是不需要额外的2D、3Dbox先验&#xff0c;可以自动解耦动静field。 核心思想&#xff1a; 1. 动、静filed都用hash grid编码&#xff0c;动态filed比静态多了时间t&#xff0c;静态的hash编码输入是…

C语言笔试题:实现把一个无符号整型数字的二进制序列反序后输出

目录 题目 实例 方法一&#xff1a;直接交换 方法二&#xff1a;间接交换 拓展 题目 编写一个函数&#xff0c;将一个无符号整数的所有位逆序&#xff08;在32位机器下&#xff09; 实例 例如有一个无符号整数 unsigned int num 32; unsigned int 在32位系统中占4个字…

如何选择优质智慧公厕系统厂家?@光明源

随着智慧城市建设的推进&#xff0c;智慧公厕系统成为提升城市公共服务水平的重要一环。选择一家优质的智慧公厕系统厂家不仅能确保设备的先进性和可靠性&#xff0c;还能提升用户体验和管理效率。以下是选择优质智慧公厕系统厂家的关键要素。 1. 厂家资质和信誉 1.1 资质认证…

VS C++常用错误与解决方法

无法找到 v143 的生成工具(平台工具集 “v143”) 若要使用 v143 生成工具进行生成&#xff0c;请安装 v143 生成工具。或者&#xff0c;可以升级到当前 Visual Studio 工具&#xff0c;方式是通过选择“项目”菜单或右键单击该解决方案&#xff0c;然后选择“重定解决方案目标…

外星人Alienware m18R1 原厂Windows11系统

装后恢复到您开箱的体验界面&#xff0c;包括所有原机所有驱动AWCC、Mydell、office、mcafee等所有预装软件。 最适合您电脑的系统&#xff0c;经厂家手调试最佳状态&#xff0c;性能与功耗直接拉满&#xff0c;体验最原汁原味的系统。 原厂系统下载网址&#xff1a;http://w…

绝对值不等式——AcWing 104. 货仓选址

绝对值不等式 定义 与数学中的绝对值不等式定义一致&#xff0c;即含有绝对值符号的不等式。 运用情况 在一些需要根据数值与特定值的距离关系来进行判断和处理的算法中。用于对数据范围进行约束和界定。 注意事项 确保对绝对值的处理正确&#xff0c;尤其是在复杂的逻辑…

基于chatgpt-on-wechat搭建个人知识库微信群聊机器人

前言 啊&#xff0c;最近在别人微信群里看到一个聊天机器人&#xff0c;感觉挺好玩的。之前GPT刚出来的时候就知道有人把聊天机器人接入到微信或者QQ中来增加互动&#xff0c;但是当时没想那个想法。 很久没关注这块了&#xff0c;发现现在可以使用大模型知识库的方式来打造自…

【面试干货】Hashtable 与 HashMap 的区别

【面试干货】Hashtable 与 HashMap 的区别 1、线程安全性2、对null值的处理3、遍历方式4、遍历示例5、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java中&#xff0c;Hashtable和HashMap都是基于哈希表实现的Map接口。然而&#…

[Django学习]前端+后端两种方式处理图片流数据

方式1&#xff1a;数据库存放图片地址,图片存放在Django项目文件中 1.首先&#xff0c;我们现在models.py文件中定义模型来存放该图片数据,前端传来的数据都会存放在Django项目文件里的images文件夹下 from django.db import modelsclass Image(models.Model):title models.C…

Windows10任务栏卡顿解决方案

一、重新启动任务资源管理器 右键底部任务栏选择“任务管理器”&#xff1b;按快捷键“CtrlShiftEsc”&#xff1b;搜索框搜索“任务管理器”并单击“打开”&#xff1b;“WinX”打开开始菜单附属菜单&#xff0c;在列表中选择“任务管理器” &#xff1b;按下“ctrlaltdelete”…

24年安克创新社招入职自适应能力cata测评真题分享北森测评高频题库

第一部分&#xff1a;安克创新自适应能力cata测评 感谢您关注安克创新社会招聘&#xff0c;期待与您一起弘扬中国智造之美。 为对您做出全面的评估&#xff0c;现诚邀您参加我们的在线测评。 测评名称&#xff1a;社招-安克创新自适应能力cata测评 第二部分&#xff1a;安克…

容器之笔记本构件演示

代码&#xff1a; #include <gtk-2.0/gtk/gtk.h> #include <glib-2.0/glib.h> #include <gtk-2.0/gdk/gdkkeysyms.h> #include <stdio.h>void rotate_book(GtkButton *button, GtkNotebook *notebook) {gtk_notebook_set_tab_pos(notebook, (notebook…

Linux驱动开发(三)--新字符设备驱动开发 LED驱动开发升级

1、新字符设备驱动原理 使用 register_chrdev 函数注册字符设备的时候只需要给定一个主设备号即可&#xff0c;但是这样会 带来两个问题 需要我们事先确定好哪些主设备号没有使用 会将一个主设备号下的所有次设备号都使用掉&#xff0c;比如现在设置 LED 这个主设备号为200&…

这周,接连两位程序员猝死...

这周接连发生了两起不幸的事。俩位程序员去世的消息&#xff0c;深感悲伤和惋惜。 6月17号下午&#xff0c;一位负责研发的女员工在虾皮研发中心办公室猝死&#xff0c;年仅 30 岁。 官方通告&#xff1a; 同一天&#xff0c;另一位科大讯飞的高级测试工程师在家突发不适离世…

UDS服务——TransferData (0x36)

诊断协议那些事儿 诊断协议那些事儿专栏系列文章,本文介绍TransferData (0x36)—— 数据传输,用于下载/上传数据时用的,数据的传输方向由不同的服务控制:0x34服务表示下载,0x35服务表示上传。通过阅读本文,希望能对你有所帮助。 文章目录 诊断协议那些事儿传输数据服务…

Xshell7免费版下载安装使用

​一、下载安装​ 1.打开官网下载 https://www.xshell.com/zh/free-for-home-school/ 2.选择合适的下载路径&#xff0c;点击下载按钮&#xff0c;然后按照提示完成安装。 二、Xshell7的使用&#xff0c;Xhell连接Linux 1.连接之前&#xff0c;确保在Linux中开启SSH。参考&a…

VBA学习(15):工作表加密保护后却把密码忘记了?

今天把过去的一篇推文重新整理一下&#xff0c;提供两种解除工作表加密的方法。 一种是傻瓜模式的VBA&#xff0c;复制运行以下代码&#xff0c;即可抹除当前工作簿所有工作表的保护加密。 Sub UnProtct()MsgBox "破解提示&#xff1a;当要求输入密码时请点击取消&#…

Pnpm:包管理的新星,如何颠覆 Npm 和 Yarn

在探索现代 JavaScript 生态系统时&#xff0c;我们常常会遇到新兴技术的快速迭代和改进。其中&#xff0c;包管理工具的发展尤为重要&#xff0c;因为它们直接影响开发效率和项目性能。最近&#xff0c;pnpm 作为一种新的包管理工具引起了广泛关注。它不仅挑战了传统工具如 np…

激励-保健理论和公平理论

激励-保健理论 herzberg的激励-保健理论中&#xff0c;保健因素是context of a job&#xff0c;激励因素是content of a job。 context of a job是受组织控制的因素&#xff0c;比如工作条件&#xff0c;基本工资&#xff0c;公司政策等&#xff0c;个人无法支配。content of…