首页 > 其他分享 >rust学习十四、编译和发布单元包Crate

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

时间:2024-12-12 20:31:43浏览次数:5  
标签:cargo 令牌 -- Crate 编译 发布 io rust

本文简要介绍如何编译和发布单元包(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 时,该值为 true
    pub 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,

 

标签:cargo,令牌,--,Crate,编译,发布,io,rust
From: https://www.cnblogs.com/lzfhope/p/18600538

相关文章

  • Rust——结构体说明【七】
    前言struct或structure是一种自定义数据类型,允许您命名和包装多个相关的值,从而形成一个有意义的组合。如果您熟悉面向对象的语言,那么struct就像对象中的数据属性。在本章中,我们将比较和对比元组与结构体,在您已经知道的基础上,来演示结构体是对数据进行分组的更好方法。我们将演......
  • Rust——使用结构体代码示例【八】
    前言为了了解我们何时可能想要使用结构体,让我们编写一个计算长方形面积的程序。我们将从使用单个变量开始,然后重构程序,直到我们改用结构体。内容现在让我们使用Cargo新建一个叫做rectangles的程序,它获取以像素为单位的长方形的宽度和高度,并计算出长方形的面积。基础代码f......
  • VS下进行CUDA编译时error MSB3721相关的原因之一
    报错:“1>D:\MicrosoftVisualStudio\2019\Community\MSBuild\Microsoft\VC\v160\BuildCustomizations\CUDA11.6.targets(790,9):errorMSB3721:命令“"C:\ProgramFiles\NVIDIAGPUComputingToolkit\CUDA\v11.6\bin\nvcc.exe"-gencode=arch=com......
  • 源码编译安装python
    python3configure参数:./configure--prefix=/yourpath/python-3.10.12/\--enable-loadable-sqlite-extensions\--enable-optimizationsmake-j16makeinstallpip3installnotebook使用jupyter需要此参数:--enable-loadable-sqlite-extensions,后续进行make&&ma......
  • 转载:【AI系统】AI 编译器后端优化
    AI编译器分为多层架构,最顶层由各种AI训练框架编写的神经网络模型架构,一般由Python编写,常见的AI训练框架有PyTorch、MindSpore、PaddlePaddle等。在导入AI编译器时需要用对应框架的converter功能转换为AI编译器统一的GraphIR,并在计算图级别由GraphOptimizer进......
  • 转载:【AI系统】AI编译器前瞻
    本文首先会基于TheDeepLearningCompiler:AComprehensiveSurvey中的调研做一个热门AI编译器的横向对比,并简要介绍几个当前常用的AI编译器。随后会分析当前AI编译器面临的诸多挑战,并展望AI编译器的未来。业界主流AI编译器对比在TheDeepLearningCompiler:A......
  • 作业Day2: 多文件编译; 思维导图
    目录①文件代码及其所需头文件分析main.c文件1.h文件1.c文件②运行结果:③代码分析结构体成员数据类型的设定:信息录入函数信息删除成绩排序信息显示自定义初始化函数④思维导图:​编辑①文件代码及其所需头文件分析作业:定义一个数组,用来存放从终端输入的5......
  • 学霸带你游戏化深入理解 Rust 生命周期
    理解Rust的生命周期机制在Rust编程语言中,生命周期是确保内存安全的重要机制之一。通过管理数据的生命周期,Rust能够防止悬垂引用、数据竞争等问题,从而在没有垃圾回收的情况下实现高效的内存管理。理解生命周期不仅对于新手至关重要,更是提高开发效率和代码质量的基础。本篇......
  • 转载:【AI系统】为什么需要 AI 编译器
    本文将通过探讨AI编译器的黄金年代以及传统编译器与AI编译器的区别等角度,来介绍为什么需要AI编译器。AI编译器黄金年代图灵奖获得者DavidPatterson在2019年5月发表了一个名为“计算机架构新的黄金年代”的演讲,他通过回顾自20世纪60年代以来的计算机架构的发展......
  • 转载:【AI系统】AI 编译器基本架构
    在上篇文章中将AI编译器的发展大致分为了3个阶段,分别为1)朴素编译器、2)专用编译器以及3)通用编译器。本文作为上一节AI编译器架构的一个延续,着重讨论AI编译器的通用架构。首先将回顾现有AI编译器架构(以PyTorch作为标杆),随后引出通用AI编译器的架构模型,并进一步介绍......