rust学习十四、编译和发布单元包Crate

news/2024/12/12 20:31:34/文章来源:https://www.cnblogs.com/lzfhope/p/18600538

本文简要介绍如何编译和发布单元包(crate)。

很可惜的是,找了一会,没有发现可以发布到除了Crates.io之外的地方。 可能是我没有找到,也可能仅仅是因为我本人仅是初学者。希望国内的大学和其它机构能够创建那么一个国内的库,避免哪天封禁后,无处可去。

本文对应相关书籍的第十四章节的第1,2子章节。

发布一个单元包的大概过程:

  1. 配置库的构建选项等
  2. 给代码添加友好的注释
  3. 注册Crates.io的账号,并获得令牌和设置邮件。实际是GitHub账户
  4. 编译代码 (可跳过)
  5. 使用cargo login登录
  6. 使用cargo publish发布

一、配置构建选项等

主要工作是修改Cargo.toml。

示例配置:

[package]
# 名称- 如果要发布,则必须是唯一
name = "minigrep"
# 版本 -这个可以自己定义
version = "0.1.0"
# 发行版-这个不允许定。截止2024/12 ,只允许 2015,2018,2021,2024
edition = "2021"
description ="一个从文本文件中查找字符的命令行工具。只支持utf8编码的文件"
#许可说明
license = "MIT OR Apache-2.0"[dependencies]# 配置说明-开发
[profile.dev]
# 优化级别,默认是0,对于发行是3。此值越小表示优化程度越低。
# 优化越多,编译时间越长
opt-level = 0# 配置说明-发布
[profile.release]
opt-level = 3

package -包说明

  • name - 包名称,必须有的。不可在crates.io内重复。先到先得。没有测试过是否可以使用中文,理论上应该可以
  • vesion -版本,必须有
  • edition -发行版,必须有,截止2024/12 ,只允许 2015,2018,2021,2024
  • description - 描述,必须有
  • license - 许可,必须有。如果不希望个性化的,就简单的按照书本要求的即可。据说这里采用的是linux的spdx符号.

profile.xxx - 分类配置说明

可以不配置,因为默认情况下,开发的时候,采用0级别,发布的时候采用3级别。

opt-level 介于 [0,3], 越大编译花费时间越长,理论上可执行结果性能更好.

 

其它配置

暂不论,据作者所言,后面的章节还会继续讨论这个问题。所以,我本人也会再以后就cargo这个工具专门编写有关日记。

 

另外为了发布后好看一点,建议在Cargo.toml同级别目录中创建一个README.md

 

二、给代码添加友好的注释

重点:

  1. 有三种注释,分别是 ///,//!, /**/
  2. 注释的部分遵循markdown语法。所以要修改布局和演示等等,只需要遵循markdown语法即可
  3. 使用 cargo doc --open 确认下效果

///和/**/效果是一样的,看个人习惯

//! 会展示稍微不一样的内容,效果相当于一个序言,概述等

如果要添加代码块,则用··· 即可.

示例:

//! minigrep
//! 这是一个单元包概述
//! minigrep 是一个命令行程序,它允许用户搜索文本文件内容。/// 参数配置结构体
#[derive(Debug)]
pub struct Config {/// 被搜索的文件名,可以是全路径(含文件名),也可以不含路径的文件名
    pub file_name: String,/// 从被搜索的文件中查找的字符串
    pub target: String,/// 是否显示帮助信息.仅当用户输入的第一个参数为 --help 时,该值为 truepub show_help: bool,
}/*** 处理参数的模块 <br>* 包括 build、is_too_big,show_help*/
pub mod config {use super::Config;use std::env;use std::fs;use std::path::Path;/// **构建一个参数配置结构体** <br>/// **args** 参数列表 ,数组类型,非空。第一个表示程序路径,第二个为target_name,第三个为file_path <br>/// 返回: 参数配置结构体<br>/// 异常:   如果参数异常则返回错误信息<br>/// 例子:/// ```/// use std::env;/// use minigrep::{config,search};/// fn main() {///   let args: Vec<String> = env::args().collect();///   let con=config::build(&args).unwrap_or_else(|err|{///       eprintln!("程序异常:{}",err);///       std::process::exit(1);///     });/// }/// ```

 

看效果:

 

 

 

三、账户:令牌和邮件

登录crates.io。

获取令牌

注意的是,必须先用github的账号登录。如果使用邮箱认证,还需要登录确认下。

登录后,点击“Account Settings”,即可,进入后点击左边的“API Tokens”:

 

过期时间和作用范围,自己选。上面是不过期,所有范围。

点击“Generate Token",结果如下:

把最下面这个字符串复制下来,保存好。

这个令牌可以重新生成。

设置邮件

点击上图的"Profile",还需要设置邮件,具体略。设置完毕后,如下图:

 

 

四、编译代码

运行 cargo build --release

这一个步骤可以省略,因为执行cargo publish的时候会自动编译

五、使用cargo login登录

执行 cargo login xxxx,  其中xxx是Crates.io获得的api令牌

 

注意:如果申请的令牌是无期限的,则建议定期做个cargo logout。避免泄露令牌。

六、使用cargo publish发布

6.1、运行 cargo publish

 很不幸的是,这个minigrep已经存在了,所以必须修改下。

再次发布,提示确认邮件地址有问题,要去该下账户中的邮件信息(如果没有设置邮件)。

如果成功,大概如下:

从这个输出看,发布经过大概几个过程:打包,验证,编译,上传。

6.2、确认发布结果

有两个方式:

  1. 另启一个工程,引用mmsearch 0.1.0版本
  2. 直接在Crates.io中进行搜索

采用第二个方式:

 

6.3、取消和撤销取消

取消发布

cargo yank --vers 0.1.0

 再看看crates.io

 

撤销取消

cargo yank --vers 0.1.0  --undo

 

常识

不同于maven等工具,cargo 不能对同个版本重新发布。

这一点,本人导致比较赞同这种策略。  当然maven等策略也有存在的场景。

但个人还是推荐这个!

 

6.4、publish的其它

cargo help publish ,可以看到具有许多的选项,主要是几个部分:

  • 发布相关-包括
    • --token token
    •  --registry registry
  • 打包 
    • --target triple
    • --target-dir directory
  • 编译
    • -p
  • 通用
    • +toolchain
    •  --config KEY=VALUE or PATH
  • 其它...

不一一解释了。

不过有一个值得关注的,就是 --registry registry,中应该是允许发布到Crates.io之外的地方。

 

七、小结

  1. 按照默认的选项发布一个应用还是很容易的
  2. 发布具有更多丰富的选项,远不止本文所提到的。rust的发布功能还是很强大的
  3. rust的发布明显对于时下的流行技术还是比较关注,注入toml,markdown,

 

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

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

相关文章

Https身份鉴权(小迪网络安全笔记~

引子:上一篇主要对Http数据包结构、内容做了介绍,本篇则聊聊Https、身份鉴权等技术。附:完整笔记目录~ ps:本人小白,笔记均在个人理解基础上整理,若有错误欢迎指正! 5.2 Https&身份鉴权引子:上一篇主要对Http数据包结构、内容做了介绍,本篇则聊聊Https、身份鉴权等…

转载:【AI系统】Ascend C 编程范式

AI 的发展日新月异,AI 系统相关软件的更新迭代也是应接不暇,作为一篇讲授理论的文章,我们将尽可能地讨论编程范式背后的原理和思考,而少体现代码实现,以期让读者理解 Ascend C 为何这样设计,进而随时轻松理解最新的 Ascend C 算子的编写思路。 本文将针对 Ascend C 的编程…

Day45--“ZWSP” 字符的作用

Day45--“ZWSP” 字符的作用在TestPanel里面,创建main方法,创建Frame、Panel的对象。​ Frame不使用默认的布局管理器​ 设置frame的坐标、颜色​ 设置panel的坐标、颜色​ frame中添加panel​ 可见当我把上面的话复制粘贴到IDEA里面,效果是图片上这样的…

Transformers 框架 Pipeline 任务详解(三):词元分类(token-classification)和命名实体识别

本文深入简出介绍了 Transformers 框架中的 token-classification 任务,从基础概念到实际应用,包括命名实体识别、分词和词性标注,最后还会提供详细的代码示例和 WebUI 界面操作,帮助你快速上手词元分类和命名实体识别……微信公众号:老牛同学 公众号标题:Transformers 框…

转载:【AI系统】算子开发编程语言 Ascend C

本文将深入探讨昇腾算子开发编程语言 Ascend C,这是一种专为昇腾 AI 处理器算子开发设计的编程语言,它原生支持 C 和 C++标准规范,最大化匹配用户的开发习惯。Ascend C 通过多层接口抽象、自动并行计算、孪生调试等关键技术,极大提高算子开发效率,助力 AI 开发者低成本完成…

知攻善防应急响应靶场练习-web1

题目描述 前景需要: 小李在值守的过程中,发现有[CPU](https://so.csdn.net/so/search?q=CPU&spm=1001.2101.3001.7020)占用飙升,出于胆子小,就立刻将服务器关机,这是他的服务器系统,请你找出以下内容,并作为通关条件:1.攻击者的shell密码 2.攻击者的IP地址 3.攻击…

jenkins升级实例

jenkin升级步骤1.下载jenkins.war包和对应的jdk版本2.只需要替换原来启动命令中的java路径和jenkins.war包即可原来版本jenkins的启动命令/etc/alternatives/java -Dcom.sun.akuma.Daemon=daemonized -Djava.awt.headless=true -DJENKINS_HOME=/var/lib/jenkins -jar /usr/lib/…

企业消费管理再进阶:SIMPLE模型帮你选择服务商

公司上万名员工每天满世界飞,差旅应该怎么管?员工出差、加班,每天数万单打车费用,怎么管?招待用餐和员工用餐,如何做到能成本更低,体验更好? 包括差旅、招待用餐、员工用餐、用车、福利等,都是企业消费的核心场景。在当前的经济形势下,企业焦点已经从单纯追求用户规模…

鸿蒙NEXT开发案例:保质期计算

【引言】 保质期计算应用是一个基于鸿蒙NEXT框架开发的数字和文本统计组件。用户可以输入商品的生产日期和保质期天数,应用会自动计算并展示相关信息,包括保质状态、剩余天数、生产日期和到期日期。 【环境准备】 • 操作系统:Windows 10 • 开发工具:DevEco Studio NEXT B…

rasa 最简单对话实现

rasa对话的最简单实现,涉及到了 domain.yml、data\nlu.yml、data\rules.yml 等文件。1.1 简单实现 1.1.1 定义意图和实体 最简单的就是 data/nlu.yml 中编辑 version: "3.1"nlu: - intent: greetexamples: |- 你好- 嗨- 早上好- 晚上好- intent: goodbyeexamples: |…

postgres备份与恢复

一、脚本说明1.环境 docker部署的postgres服务端,宿主机安装postgres客户端,使用命令进行备份恢复2.数据库备份: 使用 pg_dump 命令来备份数据库,并将其压缩为 .sql.gz 或者.tar.gz 格式。 在备份时会包含创建数据库的语句。3.备份清理: 使用 find 命令清理超过指定天数(…