ToB企服应用市场:ToB评测及商务社交产业平台

标题: rust学习十四、编译和发布单元包Crate [打印本页]

作者: 何小豆儿在此    时间: 2024-12-12 20:33
标题: rust学习十四、编译和发布单元包Crate
本文简要介绍如何编译和发布单元包(crate)。
很可惜的是,找了一会,没有发现可以发布到除了Crates.io之外的地方。 可能是我没有找到,也可能仅仅是由于我本人仅是初学者。希望国内的大学和其它机构可以或许创建那么一个国内的库,避免哪天封禁后,无处可去。
本文对应相关书籍的第十四章节的第1,2子章节。
发布一个单元包的大概过程:
一、配置构建选项等

主要工作是修改Cargo.toml。
示例配置:
  1. [package]
  2. # 名称- 如果要发布,则必须是唯一
  3. name = "minigrep"
  4. # 版本 -这个可以自己定义
  5. version = "0.1.0"
  6. # 发行版-这个不允许定。截止2024/12 ,只允许 2015,2018,2021,2024
  7. edition = "2021"
  8. description ="一个从文本文件中查找字符的命令行工具。只支持utf8编码的文件"
  9. #许可说明
  10. license = "MIT OR Apache-2.0"
  11. [dependencies]
  12. # 配置说明-开发
  13. [profile.dev]
  14. # 优化级别,默认是0,对于发行是3。此值越小表示优化程度越低。
  15. # 优化越多,编译时间越长
  16. opt-level = 0
  17. # 配置说明-发布
  18. [profile.release]
  19. opt-level = 3
复制代码
package -包分析
profile.xxx - 分类配置分析
可以不配置,由于默认情况下,开辟的时候,采用0级别,发布的时候采用3级别。
opt-level 介于 [0,3], 越大编译花费时间越长,理论上可执行效果性能更好.
 
其它配置
暂不论,据作者所言,背面的章节还会继续讨论这个问题。所以,我本人也会再以后就cargo这个工具专门编写有关日志。
 
另外为了发布后悦目一点,发起在Cargo.toml同级别目次中创建一个README.md
 
二、给代码添加友好的注释

重点:
///和/**/效果是一样的,看个人习惯
//! 会展示稍微不一样的内容,效果相当于一个序言,概述等
如果要添加代码块,则用··· 即可.
示例:
  1. //! minigrep
  2. //! 这是一个单元包概述
  3. //! minigrep 是一个命令行程序,它允许用户搜索文本文件内容。
  4. /// 参数配置结构体
  5. #[derive(Debug)]
  6. pub struct Config {
  7.     /// 被搜索的文件名,可以是全路径(含文件名),也可以不含路径的文件名
  8.     pub file_name: String,
  9.     /// 从被搜索的文件中查找的字符串
  10.     pub target: String,
  11.     /// 是否显示帮助信息.仅当用户输入的第一个参数为 --help 时,该值为 true
  12.     pub show_help: bool,
  13. }
  14. /**
  15. * 处理参数的模块 <br>
  16. * 包括 build、is_too_big,show_help
  17. */
  18. pub mod config {
  19.     use super::Config;
  20.     use std::env;
  21.     use std::fs;
  22.     use std::path::Path;
  23.     /// **构建一个参数配置结构体** <br>
  24.     /// **args** 参数列表 ,数组类型,非空。第一个表示程序路径,第二个为target_name,第三个为file_path <br>
  25.     /// 返回: 参数配置结构体<br>
  26.     /// 异常:   如果参数异常则返回错误信息<br>
  27.     /// 例子:
  28.     /// ```
  29.     /// use std::env;
  30.     /// use minigrep::{config,search};
  31.     /// fn main() {
  32.     ///   let args: Vec<String> = env::args().collect();
  33.     ///   let con=config::build(&args).unwrap_or_else(|err|{
  34.     ///       eprintln!("程序异常:{}",err);
  35.     ///       std::process::exit(1);
  36.     ///     });
  37.     /// }
  38.     /// ```
复制代码
 
看效果:

 

 
 
三、账户:令牌和邮件

登录crates.io。
获取令牌
注意的是,必须先用github的账号登录。如果利用邮箱认证,还需要登录确认下。
登录后,点击“Account Settings”,即可,进入后点击左边的“API Tokens”:

 
过期时间和作用范围,自己选。上面是不过期,所有范围。
点击“Generate Token",效果如下:

把最下面这个字符串复制下来,保存好。
这个令牌可以重新天生。
设置邮件
点击上图的"rofile",还需要设置邮件,具体略。设置完毕后,如下图:

 
 
四、编译代码

运行 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、确认发布效果

有两个方式:
采用第二个方式:

 
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 ,可以看到具有许多的选项,主要是几个部分:
不逐一解释了。
不过有一个值得关注的,就是 --registry registry,中应该是允许发布到Crates.io之外的地方。
 
七、小结

 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4