当前位置: 首页 > news >正文

【跟小嘉学 Rust 编程】十四、关于 Cargo 和 Crates.io

系列文章目录

【跟小嘉学 Rust 编程】一、Rust 编程基础
【跟小嘉学 Rust 编程】二、Rust 包管理工具使用
【跟小嘉学 Rust 编程】三、Rust 的基本程序概念
【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念
【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据
【跟小嘉学 Rust 编程】六、枚举和模式匹配
【跟小嘉学 Rust 编程】七、使用包(Packages)、单元包(Crates)和模块(Module)来管理项目
【跟小嘉学 Rust 编程】八、常见的集合
【跟小嘉学 Rust 编程】九、错误处理(Error Handling)
【跟小嘉学 Rust 编程】十一、编写自动化测试
【跟小嘉学 Rust 编程】十二、构建一个命令行程序
【跟小嘉学 Rust 编程】十三、函数式语言特性:迭代器和闭包
【跟小嘉学 Rust 编程】十四、关于 Cargo 和 Crates.io

文章目录

  • 系列文章目录
    • @[TOC](文章目录)
  • 前言
  • 一、发布配置(Release profile)
    • 1.1、发布配置(Release profile)
    • 1.2、自定义 profile
  • 二、发布 crates.io
    • 2.1、crates.io
    • 2.2、文档注释
      • 2.2.1、文档注释介绍
      • 2.2.2、常用章节
      • 2.2.3、文档注释作为测试
      • 2.2.4、为包含注释的项添加文档注释
    • 2.3、pub use
    • 2.4、发布 crate 步骤
  • 三、Cargo 工作空间(Workspaces)
    • 3.1、工作空间
    • 3.2、创建工作空间
    • 3.3、在工作空间依赖外部 crate
  • 四、安装 二进制 crate
  • 五、使用自定义命令扩展 cargo
  • 总结

前言

到目前为止,我们讲解了 Cargo 的最基本的特性来构建、运行、测试代码,但是它可以为我们做更多的事情。本章节讲解 Cargo 更高级的特性,例如:

  1. 通过 release profile 来自定义构建
  2. 在 crates.io 上发布库文件
  3. 通过 workspaces 组织大工程
  4. 从 crates.io 来安装库
  5. 使用自定义命令扩展 cargo

主要教材参考 《The Rust Programming Language》


一、发布配置(Release profile)

1.1、发布配置(Release profile)

发布配置(Release profile) 是 预定义的,也可以自定义(可以使用不同的配置) 对代码编译拥有更多的控制。每个Profile的配置都独立于其他的Profile。

Cargo 主要两个 Profile:

  • dev profile:适用于开发(开发环境), cargo build
  • release profile:适用于发布(生产环境),cargo build --release

1.2、自定义 profile

针对每个 profile,Cargo 都提供了默认的配置,如果想自定义 xxx profile 的配置,可以在 cargo.toml 里面添加 [profile.xxx] 区域,在里面覆盖默认配置的子集。

[profile.dev]
opt-level = 0[profile.release]
opt-level = 3

opt-level 参数表示优化级别,编译时间比较久。针对每个配置的默认值和完整选项,可以参考 profile

二、发布 crates.io

2.1、crates.io

可以通过发布包来共享你的代码,crate 的注册表 在 crates.io 上,它会分发已注册的包的源代码,主要托管开源的代码。

2.2、文档注释

2.2.1、文档注释介绍

文档注释用于生成HTML文档,显式公共 API的文档注释(如何使用API),使用 /// 来表示 支持markdown 语法。

使用 cargo doc 可以生成文档,它会运行 rustdoc 工具,把生成的HTML文档放在 target/doc 目录下。

使用 cargo doc --open 可以打开生成的文档。

2.2.2、常用章节

  • Examples:示例代码
  • Panics:函数可能发生 panic 的场景
  • Errors:如果函数返回 Result,描述可能的错误种类,以及可导致错误的条件
  • Safety:如果函数处于 unsafe 调用,就可以解释函数 unsafe 的原因,以及调用者确保使用的前提。

2.2.3、文档注释作为测试

示例代码块的附加值:运行 cargo test 可以把文档注释中的示例代码作为测试来运行。

2.2.4、为包含注释的项添加文档注释

  • 符号://!
  • 此类注释通常用于描述 crate 和模块:
    • crate root (按照惯例 src/lib.rs)
    • 一个模块内,将 crate 或模块作为一个整体进行记录

2.3、pub use

使用 pub use 导出方便使用的公共 API。

2.4、发布 crate 步骤

一旦发布,就是永久性,该版本无法覆盖,代码无法删除,目的:依赖于该版本的项目可继续正常工作

1、创建并设置 crate.io 账号,并且获得 api token

2、 运行命令: cargo login [api token],通知 cargo ,你的 api token 存储在本地 ~/.cargo/credentials

3、发布之前需要 在 [package] 上设置元数据。

  • crate 需要唯一的名称:name
  • description:一两句话即可
  • license:需要提供许可证的标识值(可以在 http://spdx.org/licenses/ 查找)。
  • version:可以参照 http://semver.org 来使用你的语义版本
  • author

4、发布:使用 cargo publish 命令

5、使用 cargo yank 撤回版本:

  • 不可以删除 crate 之前的版本
  • 但是可以防止其他项目把它作为新的依赖,但是已经存在的项目可以继续作为依赖

三、Cargo 工作空间(Workspaces)

3.1、工作空间

Cargo 工作空间,帮助管理多个相互关联需要协同开发的 crate。cargo 工作空间就是一套共享同一个 cargo.lock和输出文件夹的包。

3.2、创建工作空间

[workspace]
members = ["adder"
]

运行 :cargo run -p 二进制crate

3.3、在工作空间依赖外部 crate

工作空间只有一个 cargo.lock,在工作空间的顶层目录,保证工作空间内所有 crate 的使用的依赖的版本都相同,工作空间内所有 crate 相互兼容。

四、安装 二进制 crate

  • 命令 cargo install

  • 来源:crates.io

  • 限制:只能安装具有二进制目标(binary target)的crate

    • 二进制目标 (binary target)是一个可运行的程序,由 src/main.rs 或其他被指定为二进制文件的crate 生成
  • 通常在 README 里面有关于 crate 的描述

    • 拥有 binary target
    • 拥有 library target
    • 两者兼备
  • cargo install 安装的二进制目录存在根目录的bin文件夹

  • 如果你使用 rustup 安装的 rust 没有任何自定义配置,那么二进制文件将存放在 $HOME/.cargo/bin。

五、使用自定义命令扩展 cargo

  • cargo 被设计成可以使用自命令扩展
  • 如果$PATH中的某个二进制文件是 cargo-something,你可以像子命令一样运行:cargo something。
  • 类似这样的自定义命令可以通过该命令列出:cargo --list
  • 优点:可以使用cargo install 来安装扩展,像内置工具一样来使用。

总结

以上就是今天要讲的内容

相关文章:

【跟小嘉学 Rust 编程】十四、关于 Cargo 和 Crates.io

系列文章目录 【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学…...

防关联指纹浏览器:高效地管理你的Facebook账户

Facebook,作为全球最受欢迎社交平台的第一名已经成为我们日常和工作中不可或缺的一部分了。不管是用于日常分享、媒体营销、还是店铺运营,Facebook都占据着重要的位置。多个Facebook账户的优势非常明显,然而,当你需要同时管理他们…...

前端学习记录~2023.8.15~JavaScript重难点实例精讲~第7章 ES6(1)

第 7 章 ES6 前言7.1 let关键字和const关键字7.1.1 let关键字(1)let关键字的特性(2)使用let关键字的好处 7.1.2 const关键字(1)const关键字的特性 7.2 解构赋值7.2.1 数组的解构赋值(1&#xff…...

WebSocket详解以及应用

😜作 者:是江迪呀✒️本文关键词:websocket、网络、长连接、前端☀️每日 一言:任何一个你不喜欢而又离不开的地方,任何一种你不喜欢而又无法摆脱的生活,都是监狱! 一、前言 我们在…...

如何评估开源项目的活跃度和可持续性?

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...

远程Linux/ubuntu服务器后台不间断运行py文件/sh脚本

通常我们在生产环境中运行一些项目时需要将程序不间断的运行在服务器上,并且将日志文件打印到某个文件中,直到程序运行结束,下面介绍了在Linux服务器上不间断运行py文件的方式,以及如何保存相应的日志信息。 对于 .py 文件&#x…...

记录一个诡异的bug

将对接oa跳转到会议转写的项目oa/meetingtranslate项目发布到天宫,结果跳转到successPage后报错 这一看就是successPage接口名没对上啊,查了一下代码,没问题啊。 小心起见,我就把successPage的方法请求方式从Post改为Get和POST都…...

Xamarin.Android中的Fragment

目录 1、Activity中使用Fragment2、Fragment与Activity通信3、Fragment与其他的Fragment通信 1、Activity中使用Fragment 一般而言,会在activity中添加一个加载fragment的方法。通过点击菜单的按钮,加载不同的fragment。其样子一般是这样的:…...

portainer初体验

官方文档 安装 docker 这里采用的的是国内汉化的一个镜像,版本号2.16.2。 地址 docker run -d --restartalways --name"portainer" -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock 6053537/portainer-ce体验 访问9000端口。 尝试&#x…...

4G数传方案(合宙cat1模块)

一. 合宙Cat1简介 合宙 Air724 模组推出的低功耗,超小体积,高性能嵌入式 4G Cat1 核心版,标准的 2.54 排针、最小成本的进项 2G、4G Cat4 切换;主要功能如下: 实际测试工作环境为-35℃-75℃; 支持 5-12V 供电或者 3.7…...

ElasticSearch - 海量数据索引拆分的一些思考

文章目录 困难解决方案初始方案及存在的问题segment merge引入预排序 拆分方案设计考量点如何去除冗余数据按什么维度拆分,拆多少个最终的索引拆分模型演进历程整体迁移流程全量迁移流程流量回放比对验证异步转同步多索引联查优化效果 总结与思考参考 困难 索引数据…...

【SA8295P 源码分析】83 - SA8295P HQNX + Android 完整源代码下载方法介绍

【SA8295P 源码分析】83 - SA8295P HQNX + Android 完整源代码下载方法介绍 一、高通官网 Chipcode 下载步骤介绍1.1 高通Chipcode 下载步骤1.2 高通 ReleaseNote 下载方法二、高通 HQX 代码介绍2.1 完整的 HQX 代码结构:sa8295p-hqx-4-2-4-0_hlos_dev_qnx.tar.gz2.2 sa8295p-…...

【设计模式--原型模式(Prototype Pattern)

一、什么是原型模式 原型模式(Prototype Pattern)是一种创建型设计模式,它的主要目的是通过复制现有对象来创建新的对象,而无需显式地使用构造函数或工厂方法。这种模式允许我们创建一个可定制的原型对象,然后通过复制…...

初识 Redis

初识 Redis 1 认识NoSQL1.1 结构化与非结构化1.2 关联和非关联1.3 查询方式1.4. 事务1.5 总结 2 Redis 概述2.1 应用场景2.2 特性 3 Resis 全局命令4 Redis 基本数据类型4.1 String4.1.1 常用命令4.1.2 命令的时间复杂度4.1.3 使用场景 4.2 Hash4.2.1 常用命令4.2.2 命令的时间…...

php灵异事件,啥都没干数据变了?

这篇文章也可以在我的博客查看 搞WordPress&#xff0c;难免跟php打交道 然而这弱类型语言实在坑有点多 这不今儿又踩了个大坑直接时间-1&#x1f605; 问题 话不多说直接上代码 <?php $items [1,2];foreach ($items as &$item) {/*empty loop*/} print_r($items)…...

【ffmpeg】基于需要使用videocapture的opencv编译配置(C++)

目录 配置简介ffmpeg源码编译方法记录gstreamer命令行安装方法opencv的编译项记录 配置简介 opencv使用videocapture读取视频流时&#xff0c;需要借助底层的ffmpeg库。如果不能正确编译&#xff0c;会报错&#xff0c;现记录正确编译配置方法。 ffmpeg源码编译方法记录 ope…...

Redisson分布式锁 原理源码 分析

# 基于setnx实现的分布式锁存在的问题&#xff1a; # 为了解决上面的问题&#xff0c;可以用Redisson # Redisson入门 # Redisson可重入锁原理 获取锁的Lua脚本&#xff1a; 释放锁的Lua脚本&#xff1a; # 锁重试原理分析 tryLock&#xff08;&#xff09;底层代码分析 tim…...

Cocos独立游戏开发框架中的事件管理器

引言 本系列是《8年主程手把手打造Cocos独立游戏开发框架》&#xff0c;欢迎大家关注分享收藏订阅。在独立游戏开发中&#xff0c;事件管理器是一个不可或缺的组件。它为开发者提供了一种灵活的方式来处理游戏内部各种状态变化和用户交互&#xff0c;实现模块之间的解耦和通信…...

keepalived+haproxy 搭建高可用高负载高性能rabbitmq集群

一、环境准备 1. 我这里准备了三台centos7 虚拟机 主机名主机地址软件node-01192.168.157.133rabbitmq、erlang、haproxy、keepalivednode-02192.168.157.134rabbitmq、erlang、haproxy、keepalivednode-03192.168.157.135rabbitmq、erlang 2. 关闭三台机器的防火墙 # 关闭…...

网络安全(黑客)零基础自学

网络安全是什么&#xff1f; 网络安全&#xff0c;顾名思义&#xff0c;网络上的信息安全。 随着信息技术的飞速发展和网络边界的逐渐模糊&#xff0c;关键信息基础设施、重要数据和个人隐私都面临新的威胁和风险。 网络安全工程师要做的&#xff0c;就是保护网络上的信息安…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

springboot 日志类切面,接口成功记录日志,失败不记录

springboot 日志类切面&#xff0c;接口成功记录日志&#xff0c;失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心&#xff0c;直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法&#xff0c;涵盖基础规则、优化算法和容错机制&#xff1a; 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则&#xff1a; 大尺寸/重量积木在下&#xf…...